2011-02-12 59 views
3

我使用的建设,“如果”,在HSQL:使用在建工程在休眠

String q = "SELECT id, name, " + 
       "IF (ABS(name) > 0, LPAD(ABS(name), 4, '0'), name) AS tord " + 
       "FROM table where city= " + cityId + " order by tord"; 

    Query query = session.createSQLQuery(q); 
    List<Object[]> list = query.list(); 
    session.getTransaction().commit(); 
    session.close(); 

,现在我想重构这段代码用HQL。我怎样才能做到这一点? 谢谢。

回答

9

选项1.

更换IF与CASE:

(case when ABS(name) > 0 then LPAD(ABS(name), 4, '0' else name end) AS tord 

详见HQL documentation

选项2

HQL支持本机的功能。如果封装在自定义的SQL函数的计算,你可以写这样的:

select t.*, paddNumber(t.name, 4) as tord from TableEntity t 
where t.city = :city order by tord 

有没有环境检查,但认为每个结果记录将被表示为对象[]。第一个元素将包含您的实体,第二个元素包含tord。

选项3

如果可能,改写应用程序逻辑。在保存记录之前,可以通过不同的方法在字段'名称'中添加所需的填充。这将在排序过程中删除不必要的数据库计算。