Duvida para listar registros usando HQL (Hibernate)

3 respostas
L

Olá amigos, estou com dúvida para fazer duas seleções em minha classe. Eu tenho a classe Chamado:

public class Chamado {
    @Id
    @GeneratedValue
    private Long id;
    @ManyToOne
    private Estab estab;
    @ManyToOne
    private Status status;
    @ManyToOne
    private Usuario relator;
    @ManyToOne
    private Setor setor;
    @Temporal(TemporalType.DATE)
    private Date dtabertura;
    @Column(length=250)
    private String assunto;
    @OneToMany(mappedBy="chamado")
    private List<ItemChamado> itens;
    @OneToMany
    private List<Usuario> interessados;

Eu preciso pegar desta entidade dois resultados:

  • Listar todos os Chamados que tenham um determinado Usuario na listagem “interessados”
  • Listar todos os Chamados que não tenham nenhum Usuario na listagem “interessados”

Na meu DAO estava fazendo assim:

public List<Chamado> listaNovos(Usuario u) {
        String hql = "select c from Chamado as c where c.setor = :setor";  //and não tenha nenhum interessado
        Query query = getSession().createQuery(hql);
        query.setParameter("setor", u.getSetor());
        return query.list();
    }
    public List<Chamado> listaPendentes(Usuario u) {
        String hql = "select c from Chamado as c ";  //where interessado = :usuario
        Query query = getSession().createQuery(hql);
        query.setParameter("usuario", u);
        return query.list();
    }

Como resolver isto ??

Obrigado

3 Respostas

marciobarroso

Eu tenho quase certeza que você consegue resolver o problema usando Criteria.

Faça o seguinte :

public List&lt;Chamado&gt; listaNovos(Usuario u) {  
   Criteria criteria = getSession().createCriteria(Chamado.class);
   criteria.add(Property.forName("setor").eq(u.getSetor()));
   return criteria.list(); 
}

O outro caso:

/**
 * Para usar este método sua classe deve implementar a interface org.hibernate.criterion.Example.PropertySelector
 */
public List&lt;Chamado&gt; listaPendentes(Usuario u) {  
   Chamado c = new Chamado();
   c.getInteressados().add(u);
   Criteria criteria = getSession().createCriteria(Chamado.class).add(Example.create(c).enableLike(MatchMode.ANYWHERE).ignoreCase().setPropertySelector(this));
   return criteria.list(); 
}

Este segundo método pode não funcionar, pois não testei.

[]'s

L

Olá Marcio, obrigado pela atenção.

No primeiro caso que você mandou funcionou mas fiquei com dúvida… No caso o que voce fez ele não está fazendo nenhum tipo de verificação na lista de interessados. O que vai caracterizar um chamado como Novo, é o fato de haver nenhum interessado…

No segundo caso, está dando erro 500 pois na linha c.getInteressados().add(u); o c.getInteressados() retorna null.

Como ajustar estes dois problemas…

é que não sei como escrever isto mesmo…

marciobarroso

Inicializa as listas no construtor da classe.

[]'s

Criado 16 de abril de 2008
Ultima resposta 17 de abr. de 2008
Respostas 3
Participantes 2