符合标准的Grails
我希望在Grails Criteria中为orderBy子句使用NVL函数。 我该如何使用? 我尝试了多种方法。 有人可以帮我吗?
SQL查询转换成Grails标准:选择* forom Domain_Table按NVL(field1,field2)顺序ASC
试过的方法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')
}
问题:我正在根据确切的顺序获取记录。 但是,我再次用描述来访问数据库以获取我不想要的域。 还有一个选择是,我可以把属性(名称,别名),我会得到的回应。 但是,我需要查询整个域名。
请帮助我。
您可以使用@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/
既然你必须使用一个标准,而不修改域类,你的第三种方法是最接近解决方案。
您可以将域类id
添加到投影中,获取所有ID,最后调用Domain.getAll()
返回实例。 你需要两个查询,但第二个使用主键,所以它会尽可能快地运行。
def ids = Domain.createCriteria().list(max:10,offset:10){
projections{
property('id')
sqlProjection("nvl(field1,field2) as description", 'description', Hibernate.STRING)
}
order('description','ASC')
}*.getAt(0) // Only selects the first column: the ID.
def instances = Domain.getAll(ids)
链接地址: http://www.djcxy.com/p/24337.html
上一篇: Grails with Criteria