当在休眠字段中使用order by进行选择时,该字段保留在具有两列的db上,由于asc和desc不能正常工作,因此排序被破坏。
示例字段定义:
@Columns(columns = {@Column(name = "currency"), @Column(name = "value")})
private BigMoney price;
在此字段上使用order by进行选择时,条件api会创建一个像这样的hql:
select * from SOMETABLE order by price desc
在某个时候,hibernate将hql转换为如下所示的sql:
select * from SOMETABLE order by currency, value desc
这是错误的。应该是
select * from SOMETABLE order by currency desc, value desc
如何绕开它?问题似乎出在org.hibernate.dialect.Dialect :: renderOrderByElement:
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();
}
在那里,它期望通过表达来获得一个顺序。但就我而言,它传递了两个串联的表达式。