[Resolvido] Dúvida em HQL

8 respostas
M

Olá pessoal.

Tô com um problema em HQL (comecei há pouco tempo a trabalhar com ela).

No sistema, um associado possui alguns lançamentos (débitos). Quero listar os lançamentos de um determinado associado entre um período de datas.

A classe Associado.java que possui um ArrayList de Lancamento

@Entity
@Table(name = "Associado")
public class Associado implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	@Column(name="cpf", unique = true, nullable = false, length = 14)
	private String cpf;
	@OneToMany(mappedBy = "associado", cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE })
	private List<Lancamento> lancamentos = new ArrayList<Lancamento>();

	// getters and setters

A classe Lancamento.java

@Entity
@Table(name = "Lancamento")
public class Lancamento implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;
	@Column(name = "valor", precision = 10, scale = 2)
	private BigDecimal valor;
	@Temporal(TemporalType.DATE)
	@Column(name = "data")
	private Calendar data;
	@ManyToOne
	@JoinColumn(name = "associado_id")
	private Associado associado;
	@Temporal(TemporalType.DATE)
	@Column(name = "dataPagamento")
	private Calendar dataPagamento;

Utilizando SQL, seria um código similar a esse:

SELECT * FROM Lancamento WHERE associado_id = 4 and data BETWEEN '1999-01-01' AND '2011-07-25'

Então, a dúvida é: qual seria o código HQL que fornece o mesmo resultado dessa instrução em SQL? (lista todos os lançamentos do associado com id = 4 entre o período de 01/01/1999 e 25/07/2011)

Obrigado a todos que ajudarem.

8 Respostas

mausexdd

Como são constantes os seus valores acho que da para passar direto no HQL exatamente como vc faria em SQL, lembre-se se fosse passar estes parametros por um usuario por exemplo voce teria que pegar estes valores e criar um metodo que recebe um HQL especifico passando parametros genericos que são setados na sua Query no seu método (no seu DAO)

acho que ficaria assim

tenta ai

mausexdd

Me desculpe eu coloquei como se sua classe Lancamento possui-se o atributo id …
se voce fizer esta NamedQuery no sua Entidade Lancamento ira funfar

tenta ai

@NamedQueries(value = { @NamedQuery(name = "Lancamento.ListarPorData", query = "from Lancamento l where l.associado.id = 4 and l.data BETWEEN '1999-01-01' AND '2011-07-25'") })
ai o name Lancamento.ListarPorData voce passa para seu metodo no DAO

henriqueluz

Me corrijam se eu estiver enganado, mas acho que seja assim:

SELECT lanc
FROM seupacote.Lancamento lanc
WHERE lanc.associado.id = 4
AND lanc.data BETWEEN '1999-01-01' AND '2011-07-25'

Abs,

M

mausexdd, tentei do jeito que você descreveu mas não deu certo… olha só o erro:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: associado_id of: br.gov.ac.associacao.modelo.Lancamento [From br.gov.ac.associacao.modelo.Lancamento l Where l.associado_id = 4 and l.data BETWEEN '1999-01-01' AND '2011-07-25']
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1201)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:275)
	at br.gov.ac.associacao.teste.ListarLancamentosPorPeriodo.main(ListarLancamentosPorPeriodo.java:28)
Caused by: org.hibernate.QueryException: could not resolve property: associado_id of: br.gov.ac.associacao.modelo.Lancamento [From br.gov.ac.associacao.modelo.Lancamento l Where l.associado_id = 4 and l.data BETWEEN '1999-01-01' AND '2011-07-25']
	at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81)
	at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:75)
	at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1465)
	at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:315)
	at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:487)
	at org.hibernate.hql.ast.tree.DotNode.getDataType(DotNode.java:611)
	at org.hibernate.hql.ast.tree.DotNode.prepareLhs(DotNode.java:263)
	at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:210)
	at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:117)
	at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:113)
	at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:880)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1330)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4471)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3944)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2047)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1972)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:831)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:617)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:244)
	at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1770)
	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:272)
	... 1 more

alguma outra ideia?

obrigado pela ajuda!

henriqueluz

Da uma olhada na minha resposta.
Esse erro ai é causado porque você ta acessando um atributo “associado_id” que não existe.
O seu atributo é um objeto associado que tem um id. Então a referencia é

M

riqueluz, o código que você sugeriu funcionou perfeitamente!

Tô com dificuldades em colocar na cabeça que, em HQL, pegamos objetos… vícios da SQL… :smiley:

Muito obrigado pela ajuda. Forte abraço.

M

Obrigado a todos que responderam ao tópico.

Um abraço.

henriqueluz

Por nada colega!
É normal causar uma confusão na cabeça pelo fato de estarmos acostumados usar somente a linguagem SQL.
Mas agora você já aprendeu que usamos objetos, então fica mais fácil. Mas de vez em quando ainda podemos cometer deslizes assim. Vícios! rs

Boa sorte e edite o tópico para “RESOLVIDO”.

Abs,

Criado 26 de julho de 2011
Ultima resposta 26 de jul. de 2011
Respostas 8
Participantes 3