我想在Grails条件中将NVL函数用于orderBy子句。我应该怎么用?我尝试了多种方法。有人可以帮我吗?
SQL查询转换为Grails条件:
通过NVL(field1,field2)ASC选择* forom Domain_Table顺序
尝试的方法1:
Domain.createCriteria().list(max:10,offset:10){
order(field1,'ASC')
order(field2,'ASC')
}
工作正常,但是生成SQL查询就像
Select * forom Domain_Table order by field1 ASC,field2 ASC
不能满足我的要求
方法2:
Domain.createCriteria().list(max:10,offset:10){
order(nvl(field1,field2),'ASC')
}
错误:Nvl不是域类的属性
方法3:
Domain.createCriteria().list(max:10,offset:10){
projections{
addProjectionToList(Projections.sqlProjection("nvl(field1,field2) as description", ['description'] as String[], [Hibernate.STRING] as Type[]), 'description'))
order('description,'ASC')
}
问题:
我正在根据确切的顺序得到记录。但是,我再次用描述打数据库以获得我不需要的域。
还有一个选项,我可以放入property(name,alias)作为响应。但是,我需要查询整个域。
请帮帮我。
最佳答案
您可以将@Formula用于Entity上的人工字段(我们将其命名为nvl
),然后在订购时使用它。
或者您可以使用Order的自定义实现
public class OrderBySqlFormula extends Order {
private String sqlFormula;
/**
* Constructor for Order.
* @param sqlFormula an SQL formula that will be appended to the resulting SQL query
*/
protected OrderBySqlFormula(String sqlFormula) {
super(sqlFormula, true);
this.sqlFormula = sqlFormula;
}
public String toString() {
return sqlFormula;
}
public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
return sqlFormula;
}
/**
* Custom order
*
* @param sqlFormula an SQL formula that will be appended to the resulting SQL query
* @return Order
*/
public static Order sqlFormula(String sqlFormula) {
return new OrderBySqlFormula(sqlFormula);
}
}
并使用
criteria.addOrder(OrderBySqlFormula.sqlFormula("(a + b) desc"));
从这里
http://blog.tremend.ro/2008/06/10/how-to-order-by-a-custom-sql-formulaexpression-when-using-hibernate-criteria-api/
关于hibernate - 有条件的Grails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33143446/