Hibernate nao filtra registros

Pessoal, tenho as classes abaixo…

@Entity
@Table(name = "Usuarios")
public class Usuario implements Serializable {
	@Id
	@Column(name = "id_usuario", nullable = false)
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Integer id_usuario;

	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name = "id_Empresa")
	private Empresa empresa;
}


@Entity
@Table(name = "Empresa")
public class Empresa implements Serializable{
	
	@Id @Column(name = "id_Empresa", nullable = false)
	private Integer id_Empresa;

	@Column(name = "nome", nullable = true)
	private String nome;
	
	@OneToMany(mappedBy="empresa", fetch=FetchType.LAZY)
	@JoinColumn(name="id_Empresa")
	private Collection<Usuario> lstUsuarios;
}

E tenho o seguinte método no DAO utilizando Criteria…

    public List<T> findByTeste(final T example)  {
        Criteria criteria = getSession().createCriteria(example.getClass());
        criteria.add(Example.create(example));
        final List<T> result = criteria.list();
        return result;
    }

Criei minha estrutura no BD, colocando o campo id_empresa na tabela Usuario… e depois fiz um INSERT na tabela empresa na tabela usuario, ou seja, inserir registros na mao mesmo no BD… Apos isso, tentei filtrar os usuarios pela empresa utilizando o hibernate… O que acontece é que toda vez o hibernate gera um SQL cujo where é 1=1… ou seja, retorna todos os usuarios…

Nao consigo fazer com que, setando a empresa no objeto usuario, ele retorne somente os usuarios daquela empresa…

alguem tem alguma sugestao ??

Obrigado…

Cara, ótima pergunta… Tive este problema alguns dias atrás…

O Example do Criteria não considera os atributos que não sejam tipos primitivos ou Strings… Para resolver este problema fiz o seguinte: via Reflections, percorri os campos da minha entidade (todas as minhas entidade herdam a classe VO), e para cara Field que encontrei que fosse herdeiro de VO e fosse diferente de null, eu adicionei um Restrictions… :smiley:

public abstract class VO implements Serializable {
    //
}

E no meu DAO (copiei o seu e coloquei o resto…rs)

public List<T> findByTeste(final T example)  {  
    Criteria criteria = getSession().createCriteria(example.getClass());  
    criteria.add(Example.create(example));  
    
    Field campos[] = example.getClass().getDeclaredFields();
    
    for (Field campo : campos) {
        if (VO.class.equals(campo.getType().getSuperclass())) {
            Object valor = Reflexao.get(campo.getName(), example);
            if (valor != null) 
                criteria.add(Restrictions.eq(campo.getName(),example));
        }
    }
    
    final List<T> result = criteria.list();  
    return result;  
} 

Pode ser que vc tenha um LAZY, porém se isso acontecer, basta obter o valor de “example” do hibernate para ter um objeto “conectado” à sessão… Espero ter ajudado, teste, e independente do resultado poste para sabermos se atendeu, se alguém tiver outra solução, por favor avise, pois esta foi a que melhor me atendeu… :stuck_out_tongue:

Abraços e boa sorte… :wink: