Hibernate Criteria API-使用asc/desc在字段上排序,多个列已断开
在hibernate字段上执行select with order by时(该字段在数据库中保留为两列),由于asc和desc不能正常工作,因此顺序被中断 字段定义示例:Hibernate Criteria API-使用asc/desc在字段上排序,多个列已断开,hibernate,sql-order-by,criteria-api,Hibernate,Sql Order By,Criteria Api,在hibernate字段上执行select with order by时(该字段在数据库中保留为两列),由于asc和desc不能正常工作,因此顺序被中断 字段定义示例: @Columns(columns = {@Column(name = "currency"), @Column(name = "value")}) private BigMoney price; 在此字段上使用order by执行选择时,criteria api会创建如下hql: select * from SOMETABLE
@Columns(columns = {@Column(name = "currency"), @Column(name = "value")})
private BigMoney price;
在此字段上使用order by执行选择时,criteria api会创建如下hql:
select * from SOMETABLE order by price desc
select * from SOMETABLE order by currency, value desc
在某种程度上,hibernate将hql转换为sql,如下所示:
select * from SOMETABLE order by price desc
select * from SOMETABLE order by currency, value desc
这是错误的。应该是
select * from SOMETABLE order by currency desc, value desc
这怎么能绕过呢?问题似乎出在org.hibernate.dialogue.dialogue::renderderByElement中:
public String renderOrderByElement(String expression, String collation, String order, NullPrecedence nulls) {
final StringBuilder orderByElement = new StringBuilder( expression );
if ( collation != null ) {
orderByElement.append( " " ).append( collation );
}
if ( order != null ) {
orderByElement.append( " " ).append( order );
}
if ( nulls != NullPrecedence.NONE ) {
orderByElement.append( " nulls " ).append( nulls.name().toLowerCase( Locale.ROOT ) );
}
return orderByElement.toString();
}
在那里,它需要一个表达式顺序。但在我的例子中,它传递了两个串联的表达式。有人在几年前遇到过这个问题,但现在仍然回答:-可能是一个bug?