2016-11-17 89 views
0

我尝试使用Hiberante标准API对结果进行升序或降序排序。org.hibernate.criterion.Order未使用'。'解析属性字符串

我有定义的类A; (以简化格式)

@Entity 
public class A { 

    @ManyToOne 
    @JoinColumn(name = "yy") 
    B b; 

    ... 
} 

而我的B实体就像;

@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; 


    } 
} 

当我使用;

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) 

当我看到B表时,我看到列“ID”在那里。没有其他列出现。 其他列在表格“C”下创建。

所以如果我使用“。”要对表C中列出的列进行排序,我得到的属性无法解决问题。

我该如何克服这个问题?

回答

1

我通过添加“别名”来修复。

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