Hi,
I searched around and found that association mapping seems to be required when using the Critiria API. I'm asking because I have a project using hibernate 3.2 and I'm doing queries like this (HQL): (Entities mapped with annotations)
Code:
Session session = HibernateHelper.getCurrentSession();
Query query = session.createQuery("SELECT DISTINCT lg FROM OnpLogradouro lg, OnpMatricula mat, OnpMovimento mov " +
"WHERE mov.onpMovimentoPK.seqRoteiro = :rot AND mov.onpMovimentoPK.codReferencia = :ref " +
"AND lg.seqLogradouro = mat.seqLogradouro AND mov.onpMovimentoPK.seqMatricula = mat.seqMatricula")
.setString("ref", codReferencia).setLong("rot", seqRoteiro);
Those entities has no association mapping defined and the query still works. I thought the same was possible with criteria. So I tried: (Expression is just a wrapper for hibernate's Expression
Code:
ExpressionCollection condition = new ExpressionList();
condition.add(new Expression("mov.SeqMatricula", "mat.SeqMatricula", ExpressionOperation.Equal));
condition.add(new Expression("mov.SeqRoteiro", "1", ExpressionOperation.Equal));
condition.add(new Expression("mov.CodReferencia", "2009.12", ExpressionOperation.Equal));
Engine engine = ApplicationControl.getActive().getConfiguration().getPersistEngine();
EntityObjectCollection objetos = (EntityObjectList) engine.list(AcqMatricula.class, condition, new String[] { "AcqMovimento", "mov", "AcqMatricula", "mat");
Code:
public EntityObjectCollection list(Class entityClass, ExpressionCollection condition, OrderCollection order, Integer offSet, Integer maxSize, String[] tables) {
Session session = openSession();
EntityObjectCollection result = new EntityObjectList();
Transaction transaction = startTrans(session);
try {
Criteria criteria = session.createCriteria(entityClass);
for (int i=0; i < tables.length; i+=2) {
criteria.createAlias(tables[i], tables[1+1]);
}
if(condition !=null){
for(Expression expression : condition){
criteria.add(CriterionGenerator.make(expression));
}
}
if(offSet > 0){
criteria.setFirstResult(offSet);
}
if(maxSize > 0){
criteria.setMaxResults(maxSize);
}
if(order !=null){
for(br.com.strategos.api.persist.engines.Order orderItem : order){
criteria.addOrder(OrderGenerator.make(orderItem));
}
}
List criteriaList = criteria.list();
for(Object obj: criteriaList){
EntityObject entity = (EntityObject) obj;
entity.setStatus(EntityStatus.Load);
entity.copyObject();
}
result.addAll(criteriaList);
commit(transaction);
} catch (Exception ex) {
ex.printStackTrace();
throw ex;
} finally {
disconnect(session);
}
return result;
And what I get is:
Quote:
org.hibernate.QueryException: could not resolve property: AcqMovimento of: br.com.strategos.acquacorporate.faturamento.AcqMatricula
So I'm confused now, do I really need to map associations to use the criteria api or I'm doing something wrong when trying to it?
TIA,
Sergio