2013-09-01 69 views
0

这是查询什么是此查询的休眠等效?(添加两列)

SELECT id, name, sub1, sub2, sub1 + sub2 AS total 
FROM mytable 
ORDER BY sub1 + sub2 ASC 

我想在这里做的是,我会添加SUB1和SUB2,结果将被命名为TOTAL ,我将使用TOTAL作为Order By。到目前为止,这是我怎么想出来的,但它没有正确渲染reults

sess().createSQLQuery("SELECT *, SUB1+ SUB2 AS TOTAL FROM TRACKS order by TOTAL ").addEntity(Student.class).list(); 

什么是什么,我试图做休眠或查询条件相同呢?

+0

假设mytable是一个实体的类名,这是有效的HQL。 –

回答

1

存在JPQL没有这样的操作,但你可以做的是做一个本地查询,如下所示:

"SELECT * FROM TRACKS order by SUB1+ SUB2" 

而作出这样一个getter:

public Double getTotal(){ //Replace Double for the data type you use 
    return sub1 + sub2; 
} 

这样,你可以命令你想要的查询。

这是你想要做什么?我不确定你是否理解得很好你的问题

0

我会说,你有两个选择:映射或自定义OrderBy对象。

1)映射:如果Total将被经常使用,可以延长你的实体映射,并创建计算/只读财产(SEEE 5.1.11. Property):

<property name="total" formula="(sub1 + sub2)" insert="false" udpate="false" /> 

现在,我们可以使用这个值轻松(和任何地方)订购:

Criteria criteria = session.createCriteria(MyClass.class); 
... 
criteria.addOrder(Order.asc("total")); 

2)我们仍然在OOP世界。 criteria.addOrder()操作期望Order对象实例。所以我们可以传递一个Custom:'MyOrder'。在我们的例子中,它可能是对象接受任何有效 SQL语句,并直接注入到这一点OR​​DER BY:

public class MyOrder extends Order { 
    public MyOrder(String propertyName, boolean ascending) { 
     super(propertyName, ascending); 
    } 

    public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) { 
     StringBuilder fragment = new StringBuilder(); 
     fragment.append(propertyName); 
     fragment.append(ascending ? " asc" : " desc"); 
     return fragment.toString(); 
    } 
} 

现在,我们可以注入任何(有效)SQL脚本到ORDER BY这样:

Criteria criteria = session.createCriteria(MyClass.class); 
... 
criteria.addOrder(new MyOrder("(sub1 + sub2)", true));