I try to sort results ascending or descending using Hiberante criteria API.
I have class A defined; (In simplified format)
@Entity
public class A {
@ManyToOne
@JoinColumn(name = "yy")
B b;
...
}
And My B entity is like;
@Entity
public class B extends C {
...
}
@Entity
public class C {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
@NotNull
@NotEmpty
@Size(max = 64)
@Pattern(regexp = REGEX_CODE, message = "Must be valid LOB Code")
@Column(name = "code", updatable = false, nullable = false)
private String code;
}
}
When I use ;
criteria.addOrder(Order.asc(b.id)); //works
criteria.addOrder(Order.asc(b.code)); //Throws error
Error
Caused by: org.hibernate.QueryException: could not resolve property: manufacturer.code of: xx.core.model.wetstock.ATG
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:62)
at org.hibernate.persister.entity.AbstractPropertyMapping.toColumns(AbstractPropertyMapping.java:77)
at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:43)
at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1793)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:510)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumnsUsingProjection(CriteriaQueryTranslator.java:469)
at org.hibernate.criterion.Order.toSqlString(Order.java:109)
at org.hibernate.loader.criteria.CriteriaQueryTranslator.getOrderBy(CriteriaQueryTranslator.java:414)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:106)
at org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:75)
at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:80)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1841)
at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:365)
at com.cdi.crud.infra.Crud.list(Crud.java:450)
at com.cdi.crud.infra.CrudService.paginate(CrudService.java:210)
When I see Table of B, I see column "id" is there. No other columns presented. Other columns are created under table "C".
So If I use "." to sort with columns presented in table C, I get property cannot resolve issue.
How can I overcome this?
I fixed by adding "alias".
eg: criteria.createAlias("b" ,"bob").addOrder(Order.asc(bob.code))