[RESOLVIDO] Hibernate ignora chave primária

Olá pessoal,

Estou com um problema estranho no hibernate. Estou realizando consultas através da API Example e quando o example é uma chave primária, o hibernate simplesmente ignora e retorna todos os registros da tabela. Já testei com os demais campos e funcionam corretamente. Não sei que o erro é na implementação da busca ou se na anotação da classe.
Estou utilizando o hibernate faz pouco tempo, ainda não conheço as peculiaridades, então, se alguém souber porque acontece isso… =/

Segue o código do método de busca e da classe:

[code]
@Entity
@Table (name = “designer”)
public class Designer {

private String name;
private String login;
private String password;
private List<Product> products = new ArrayList<Product>();


public Designer(){}

public Designer(String name, String login, String password) {
	super();
	this.name = name;
	this.login = login;
	this.password = password;
}

public Designer(String login, String password) {
	super();
	this.login = login;
	this.password = password;
}

public Designer(String login) {
	super();
	this.login = login;
}


@Column(name = "name")
public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
}

@Id
@Column(name = "login")
public String getLogin() {
	return login;
}

public void setLogin(String login) {
	this.login = login;
}

@Column(name = "pass_word")
public String getPassword() {
	return password;
}

public void setPassword(String password) {
	this.password = password;
}


@OneToMany(mappedBy="ds")
public List<Product> getProducts() {
	return products;
}

public void setProducts(List<Product> products) {
	this.products = products;
}

public void addProduct(Product p){
	products.add(p);
}
    //demais metodos

}[/code]

[code]
protected Example getExample(T entity){
Example example = Example.create(entity);
example.enableLike(MatchMode.EXACT);
example.ignoreCase();

	return example;
}

public List getEntitiesByExample(T entity) {
Example example = getExample(entity);
return session.createCriteria(classe).add(example).list();
}[/code]

Cara.
Normalmente eu coloco as anotações nos atributos e não nos métodos.
Nâo sei se assim pode.
Tenta fazer isso.

  @Column(name = "name") 
   private String name;  
  @Id  
    @Column(name = "login") 
    private String login;  
    @Column(name = "pass_word") 
    private String password;  
    @OneToMany(mappedBy="ds")  
    private List<Product> products = new ArrayList<Product>();  

//get e set

eu colocava as anotações nos atributos, mas não conseguia fazer o mapeamento dos relacionamentos. =/

O hibernate gera a seguinte consulta SQL quando eu procuro pela chave primária:
Hibernate: select this_.login as login3_0_, this_.name as name3_0_, this_.pass_word as pass3_3_0_ from designer this_ where (1=1)

E essa consulta quando eu procuro por outro campo, no caso, campo name:
Hibernate: select this_.login as login3_0_, this_.name as name3_0_, this_.pass_word as pass3_3_0_ from designer this_ where (lower(this_.name) like ?)

Erro de annotation? Bug do hibernate?

Então, o problema é que o Query By Example simplesmente ignora campos ID, então você vai precisar incluir a restrição fora do Example.

Esse post responde também, o cara usou Reflection para varrer os campos e setar os valores com restrição eq:

http://www.guj.com.br/java/75426-hibernate-nao-filtra-registros

Eu, pra simplificar incluo mais um parâmetro de id no método, e se for passado valor adiciono no criteria o eq assim:

public List<T> getEntitiesByExampleAndId(T entity, Long id) {  
    Example example = getExample(entity);
    Criteria crit = session.createCriteria(classe).add(example);
    if(id != null) {
        crit.add(Restrictions.eq("id",id));
    }
    return crit.list();  
}

Já passei bastante por isto, e cabei contornando este problema com um novo projeto só para filtro que eu criei chamado Priuli-Filter
de uma olhada http://www.guj.com.br/java/221618-filter-dinamico-para-hibernate ve se sé é isso vc queria fazer !

[quote=jamirdeajr] Eu, pra simplificar incluo mais um parâmetro de id no método, e se for passado valor adiciono no criteria o eq assim:

public List<T> getEntitiesByExampleAndId(T entity, Long id) {  
    Example example = getExample(entity);
    Criteria crit = session.createCriteria(classe).add(example);
    if(id != null) {
        crit.add(Restrictions.eq("id",id));
    }
    return crit.list();  
}

[/quote]

Adicionei essa restrição e funcionou. Descobri que em outras ocasiões, a chave primária também é ignorada, mas adicionei a restrição e funcionou. Obrigada pela ajuda.

[quote]
Já passei bastante por isto, e cabei contornando este problema com um novo projeto só para filtro que eu criei chamado Priuli-Filter
de uma olhada http://www.guj.com.br/java/221618-filter-dinamico-para-hibernate ve se sé é isso vc queria fazer ![/quote]

Dei uma olhada no seu filtro e irei utilizar na minha aplicação. :slight_smile: