[Resolvido] Dúvida JPQL

eu tenho uma Entidade1 que tem um relacionamento @OneToMany bidirecional com uma Entidade2 e essa Entidade2 tem relacionamento unidirecional @OneToOne com uma Entidade3.
Estou tentando trazer uma lista de Entidade1 de acordo com o objeto da Entidade3, mas a lista vem vazia.
estou tentando por essa JPQL

o que tem de errado com ela?

A primeira vista nada, mas coisas como "e1.entidades2.entidade3" me parecem estranhas.

Qual a query SQL sendo gerada? Ela é o que você esperava? Tente fazer com Joins, buscando a lista de entidades 2 antes de buscar a entidade 3.

eu separei a busca em duas partes.
a entidade2 buscar a entidade3 traz a lista perfeitamente.
o problema tá na entidade1 trazer as entidades2…

bom, vou por o código aqui pra ficar mais fácil, às vezes fiz uma coisa errada nos relacionamentos…

Essa é a minha entidade1 com UmParaMuitos

[code]@Entity
public class Extract {

@Id @GeneratedValue
private Long extractID;

private Status status;

private PaymentMethod payment;

@OneToMany(cascade=CascadeType.ALL, 
		fetch=FetchType.EAGER,
		mappedBy="extract")
private List<Statement> statements;

@OneToMany(cascade=CascadeType.ALL, 
		fetch=FetchType.LAZY,
		mappedBy="extract")
private List<History> histories;

@Temporal(TemporalType.TIMESTAMP)
private Calendar createDate;

@Temporal(TemporalType.TIMESTAMP)
private Calendar lastModificationDate;
    ...

}
[/code]

Essa é a minha entidade2 com MuitosPraUm e UmPraUm

[code]@Entity
public class Statement {

@Id @GeneratedValue
private Long statementID;

private DebitCredit dc;

@OneToOne(fetch=FetchType.EAGER)
@JoinColumn(name="userID")
private User user;

private String description;

private Integer value;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="extractID")
private Extract extract;
    ...

}[/code]

e por último, e não menos importante, essa é minha entidade3 de relacionamento UmPraUm

[code]@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name=“type”, discriminatorType=DiscriminatorType.INTEGER)
public abstract class User {

@Id @GeneratedValue
private Long userID;

@Column(nullable=false, updatable=false, unique=true)
private String username;

private String password;

@Column(nullable=false, unique=true)
private String email;

private Status status;

@Column(insertable=false, updatable=false)
private UserType type;

@Temporal(TemporalType.TIMESTAMP)
private Calendar createDate;

@Temporal(TemporalType.TIMESTAMP)
private Calendar lastModificationDate;

@Temporal(TemporalType.TIMESTAMP)
private Calendar lastAccessDate;
    ...

}[/code]

:roll:

ah, sim, e a verdadeira query é:

onde user é substituído por um objeto de User (not null, ainda bem que o resto das coisas tão funcionando ainda… rrairiairairiairairiara)

Tente fazer o que eu disse, simplesmente quebre a query com joins:"SELECT e FROM Extract e INNER JOIN e.statements s INNER JOIN s.user u WHERE u = :user"Se os dados existirem na base corretamente, creio que serão retornados. E outra coisa, confira o SQL gerado pela ferramenta, isso é bastante importante.

vou tentar isso hoje a noite, daí te falo se deu certo.
tomara que dê!
desespero total já! rriairiariairiairiariair

Concordo com o rodrigo.

Caso tenha mais dúvidas esse post pode ajudar: JPA Consultas e Dicas.

! ops malz

pra falar a verdade, deixei a hashCode() só com o super() do Object. precisava fazer sobrescrita?

[quote=kadu.m.lino]vc implementou hashCode() corretamente? pq sua query deveria funcionar![/quote]sério? Mesmo atravessando uma lista na JPQL? Você tem um exemplo funcional ai?

malz… não vi Herbert! comecei a escrever e parei no meio… enviei sem querer! hahahahahahaha

sobre a query, acho que tá quase lá.
ele já tá dando um erro mais legível:

Hibernate: select u.userID as userID2_0_, u.createDate as createDate2_0_, u.email as email2_0_, u.lastAccessDate as lastAcce5_2_0_, u.lastModificationDate as lastModi6_2_0_, u.password as password2_0_, u.status as status2_0_, u.type as type2_0_, u.username as username2_0_, u.hasAdminAccess as hasAdmi10_2_0_, u.signature as signature2_0_ from User u where u.userID=? 2013-04-02 00:17:52 ERROR ErrorCounter:54 - Invalid path: 'e.statements' 2013-04-02 00:17:52 ERROR ErrorCounter:50 - Invalid path: 'e.statements' Invalid path: 'e.statements' at org.hibernate.hql.internal.ast.util.LiteralProcessor.lookupConstant(LiteralProcessor.java:119) at org.hibernate.hql.internal.ast.tree.DotNode.resolve(DotNode.java:219) at org.hibernate.hql.internal.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:118) at org.hibernate.hql.internal.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:377) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3516) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3302) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:3180) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:706) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:562) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299) at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105) at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80) at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168) at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:221) at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:199) at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1735) at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:291) at infrastructure.dao.ExtractDAO.list(ExtractDAO.java:260) at infrastructure.dao.ExtractDAO.list(ExtractDAO.java:66) at tests.TestExtracts2.main(TestExtracts2.java:16)

sugestões?

mais detalhes… esse aqui é o que eu tô usando pra testar…
eu ia usar Assert, mas ainda estou me acostumando, daí acabou rodando num main mesmo…

[code]package tests;

import infrastructure.dao.ExtractDAO;

import java.util.List;

import domain.persistence.entities.Extract;
import domain.persistence.entities.User;

public class TestExtracts2 {

public static void main(String[] args) {
	
	User user = User.get(2l);
	List<Extract> e = ExtractDAO.execute().list(user);
	if(e!=null)
		System.out.println("deu certo");
	else
		System.out.println("deu merda");
	
}

}[/code]

E esse é o trecho referente ao ExtractDAO:

[code]package infrastructure.dao;

import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import domain.common.types.PaymentMethod;
import domain.common.types.Status;
import domain.persistence.entities.Extract;
import domain.persistence.entities.User;
import domain.persistence.repositories.ExtractRepository;
import domain.persistence.repositories.UserExtracts;

//TODO:
public class ExtractDAO implements ExtractRepository, UserExtracts {

private final String FROM_EXTRACT = "SELECT e FROM Extract INNER JOIN e.statements s INNER JOIN s.user u WHERE ";
private final String FIND_BY_USER = "u = :user";

   @Override
public List<Extract> list(User user) {
	args = new HashMap<>();
	query = new StringBuilder(FROM_EXTRACT);
	query.append(FIND_BY_USER);
	args.put("user", user);
	
	return list(query.toString(), args);
}

    @SuppressWarnings("unchecked")
protected List<Extract> list(String query, Map<String, Object> args) {
	List<Extract> extracts = null;
	try {
		EntityManager em = DAO.getEntityManager();
		Query q = em.createQuery(query);
		
		if(args != null) {
			for(Map.Entry<String, Object> entry : args.entrySet()) {
				q.setParameter(entry.getKey(), entry.getValue());
			}
		}
		extracts = (List<Extract>)q.getResultList();
	} catch(Exception ex) { }
	
	return extracts;
}

}[/code]

SELECT e FROM Extract INNER JOIN e.statements…

o certo seria:

SELECT e FROM Extract e INNER JOIN e.statements…

opa… verdade… faltando little alias, gerando um big error.
vou dar uma verificada aqui no que tá dando, a lista tá vindo nula, mas não está gerando nenhum erro (não tratado).
verificar se tem informações relacionadas, mas a princípio sim…

[b]perfeitinho!

quebraram um puta galho, gente! valeu mesmo![/b]

:lol: