Search code examples
javahibernatecriteriahibernate-criteria

org.hibernate.criterion.Order is not resolving properties with '.' for strings


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?


Solution

  • I fixed by adding "alias".

    eg: criteria.createAlias("b" ,"bob").addOrder(Order.asc(bob.code))