我在 HSQL 中使用“if”结构:
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 重构这段代码。我怎样才能做到这一点? 谢谢。
最佳答案
选项 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
没有环境可检查,但认为每个结果记录将表示为 Object[]。第一个元素将包含您的实体,第二个将包含 tord。
选项 3。
如果可能,重写应用程序逻辑。在保存记录之前,有多种方法可以将所需的填充添加到字段“名称”。这将在排序过程中消除数据库中不必要的计算。
关于java - 在 Hibernate 中使用 IF 构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4978024/