[RESOLVIDO] Hibernate ignora chave primária

6 respostas
junspector

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:
@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
}
protected Example getExample(T entity){
		Example example = Example.create(entity);
		example.enableLike(MatchMode.EXACT);
		example.ignoreCase();
		
		return example;
	}

public List<T> getEntitiesByExample(T entity) {
		Example example = getExample(entity);
		return session.createCriteria(classe).add(example).list();
	}

6 Respostas

otaviojava

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
junspector

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

junspector

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?

jamirdeajr

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();  
}
Priuli

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 !

junspector

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();  
}

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.


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 !

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

Criado 31 de dezembro de 2010
Ultima resposta 2 de jan. de 2011
Respostas 6
Participantes 4