Criando subqueries com Hibernate

1 de Outubro de 2009

Estava desenvolvendo uma aplicação utilizando JSF, RichFaces, JBossSeam, Hibernate entre outros. E tive a necessidade de fazer uma subquery. Tentei vários foruns e blogs, mas todos confusos. A documentação do hibernate não explica como devemos utilizar as ferramentas e métodos. Depois de muitos testes e erros encontrei a solução para as temidas subqueries. E este post tem como objetivo esclarecer seu uso.

Pois bem, minha aplicação tem várias funções para os usuários. Sendo elas:

  • Administradores
  • Anunciantes
  • Colaboradores
  • Clientes

Entidade-Relacionamento

Então o usuário pode ter a função de administrador, anunciante, colaborador e/ou clientes. Contudo este não deve ser incluídos duas vezes para um função. Ou seja, caso adicione o usuário ANDRÉ NICOLAU como administrador não será permitido sua inclusão novamente e sim sua remoção da função.

Para verificar se o usuário já está em uma determinada função a única forma via SQL é utilizar subquery. Em SQL ficararia assim o comando:

SELECT *

FROM sys_usuarios s

WHERE s.id_usuario != ( SELECT a.id_usuario

FROM sys_administradores a );

E o resultado dessa query são os usuários que ainda não estão na tabela administradores. Agora como devemos fazer isso no hibernate?

Uma consulta simples no hibernate fazemos da seguinte maneira:

List list = getSeamSession().createCriteria( Usuarios.class ).list();

Onde:

getSeamSession() retorna a sessão do hibernate para então fazermos as manipulações no BD.

createCriteria( Usuarios.class ) se traduzirmos ao pé da letra significa “criar critérios”, então é a busca por critérios. Na documentação do hibernate explica legal como criar diversos critérios de busca.

list(); retorna o conjunto de dados da busca por critérios em uma lista.

O resultado em SQL do comando acima visto é esse:

Hibernate: select this_.id_usuario as id1_13_0_, this_.ativo as ativo13_0_, this_.mail as mail13_0_, this_.nome as nome13_0_, this_.senha as senha13_0_ from sys_usuarios

Um SELECT da vida!!!!

Agora como devemos fazer uma subquery? Simplesmente seguindo os procedimentos abaixo:

1 – Criar um objeto do tipo DetachedCriteria;

DetachedCriteria dc = DetachedCriteria.forClass( Administradores.class ).
setProjection( Property.forName( “idUsuario” ) );

Essa linha de comando anterior irá criar a subquery que ficará encapsulada na query principal.

Onde:

forClass( Administradores.class ) indica qual classe será utilizada na subquery.

setProjection( Property.forName( “idUsuario” ) ); indica qual campo da subquery será retornado.

2 – Criar a busca por critério e embutir a subquery criada antes;

List list = getSeamSession().createCriteria( Usuarios.class ).
add( Property.forName( “idUsuario” ).notIn( dc ) ).list();

Parece complicado! Mas se torna bem simples quando a gente entende cada método utilizado.

Onde:

List list = getSeamSession().createCriteria( Usuarios.class ) já vimos anteriormente como funciona.

add( Property.forName( “idUsuario” ) adiciona o campo da query principal que será comparada com aquele campo retornado da subquery.

notIn( dc ) é método de comparação. No comando SQL crú utilizamos != mas podemos também utilizar NOT IN no lugar. E temos o método notIn no hibernate para representa essa comparação e também o ne para representar o !=. E o dc é a nossa subquery criada anteriormente.

.list(); para retornar a lista do resultado.

Dessa forma, nosso código fica da seguinte maneira:

//Nossa subquery

DetachedCriteria dc = DetachedCriteria.forClass( Administradores.class ).
setProjection( Property.forName( “idUsuario” ) );

// Query principal e a subquery embutida

List list = getSeamSession().createCriteria( getObject().getClass() ).
add( Property.forName( “idUsuario” ).notIn( dc ) ).list();

O hibernate monta o SQL da seguinte forma:

Hibernate: select this_.id_usuario as id1_13_0_, this_.ativo as ativo13_0_, this_.mail as mail13_0_, this_.nome as nome13_0_, this_.senha as senha13_0_ from sys_usuarios this_ where this_.id_usuario not in (select this_.id_usuario as y0_ from sys_administradores this_)

Fazendo comparação com o comando SQL crú, a query do hibernate é similar.

A partir de então é só manipular a lista de resultados.

Abraços…

Dúvidas não exaltem em perguntas.

Quadro Kanban de Bolso para SCRUM Solo

26 de Setembro de 2009

Olá a todos,

Trabalho e estudo SCRUM tem uns 5 meses, este framework caiu como uma luva para os meus projetos. Pois é rápido, fácil, eficiente, entendível pelo cliente, ou seja, resumindo, ele é ÁGIL. Não irei entrar em detalhes a respeito de suas características, já temos bastantes posts, excelentes, que dão conta do recado.

Durante esses 5 meses de estudo e tentativas de utilizar o SCRUM, percebi uma necessidade na questão da locomoção do profissional. Quem é free-lancer e trabalha em vários projetos não tem um escritório fixo, certos momentos do dia está na faculdade, no cliente 2, em casa e outros lugares. Dessa forma, fica difícil transportar o quadro kanban de cada projeto, pois até onde eu estudei, todos os quadros eram montados nas paredes dos escritórios.

Você pode até me falar que já tem software que gerencia nossos projetos em SCRUM. E eu repondo que muitos deles o usuário deve comprar licenças que são salgadas e possuir internet móvel para consulta-los, caso este seja disponibilizado na web. Aí me veio a idéia! Para os free-lancers que são desprovidos de recursos financeiros para bancar uma licença tão cara, pensei em criar o “Quadro Kanban de Bolso para SCRUM Solo”.

Quadro Kaban de Bolso

Quadro Kaban de Bolso

O grande objetivo é traduzir aquele quadro padrão de parede em duas folhas A4 dobravéis. Onde o profissional poderá está em qualquer lugar continuar o desenvolvimento de seu projeto, utilizando o framework SCRUM, sem a necessidade de um escritório fixo.

Nesse quadro kanban adicionei os seguintes itens:

  • Product Backlog
  • Sprint Backlog
  • To Doing
  • To Verify
  • Done
  • To Discuss
  • Umplaned Items
  • Impediments Backlog
  • Sprint BurnDown

Todos os itens baseados no quadro kanban montado pela BlueSoft.

Em resumo, Product Backlog são todas as funcionalidades que nosso Product Owner defini para o produto. Este checklist deve estar em linguagem não técnica.

Product Backlog

Product Backlog

Como podemos observar a lista do product backlog ficou na metada de uma folha A4. Cabe em média 15 post its de 4x5cm. Aí vem uma pergunta que você deve estar pensando. Mas cabe somente 15 post its no product backlog? Sim. A não ser que você diminua a sua letra e o post it ou otimizem na colagem de cada post it.

Pois bem, já o Sprint Backlog são todas as tarefas necessárias para alcançar cada funcionalidade (item) do Product Backlog. Essas tarefas devem estar na linguagem técnica, pois é a equipe que cria estes itens.

Sprint Backlog, To Doing e To Verify

Sprint Backlog, To Doing e To Verify

To Doing são as tarefas que estão em execução. Passando posteriormente para To Verify que são tarefas em fase de teste.

Done!

Done!

Em Done! colocamos as tarefas que passaram pelos testes e são consideradas como concluídas. No SCRUM existe post its para registrar possíveis discussões a serem feitas nas reuniões e no quadro kanban armazenamos em To Discuss. E quando possuímos tarefas não planejadas colocamos em Umplaned Items.

To Discuss e Umplaned Items

To Discuss e Umplaned Items

Toda a execução de sprints ocorre muitos impedimentos sendo eles técnicos ou não. Estes impedimentos deve ser colocados em Impediments Backlog. E com a execução das tarefas devemos atualizar nosso gráfico burndown também foi inserido no kanban de bolso.

Impediments Backlog e Sprint BurnDown

Impediments Backlog e Sprint BurnDown

O Quadro Kanban de Bolso possui os itens mínimos e necessários para executar de forma correta o framework SCRUM. A figura a seguir ilustra como fica o ambiente de trabalho para o profissional free-lancer.

Ambiente de trabalho

Ambiente de trabalho

Claro que esta é a versão inicial do quadro kanban de bolso, minha sugestão é que seja utilizado 4 folhas A4 para aumentar a área do Product Backlog e Sprint Backlog. Contudo, se o projeto que você esteja desenvolvendo seja de pequeno a médio porte o quadro apresentado atende a sua necessidade.

Espero ter sido claro e objetivo neste post. Estou disponibilizando um PDF com o molde para a construção do quadro de bolso. Quadro Kanban de Bolso.

Quando você imprimir o PDF deverá seguir esses passos: Página 1 (frente), página 2 (verso da página 1) e página 3 (frente), página 4 (verso da página 3).

Qualquer dúvida entrem em contato… Abraços…

André Nicolau – WebSofts

WebSofts objetivo do blog.

15 de Junho de 2009

Empresa de desenvolvimento de software para web. Trabalhamos com metodologias ágeis de produção de software. Utilizamos JSF, JBossSeam, RichFaces, Ruby, PHP e ZendFrameWork, MySQL, Oracle, Debian entre outras. E o nosso blog irá disponibilizar exemplos utilizando essas tecnologias. Além de dicas de como ingressar no mercado e permaner por um longo tempo.