java - 在 Hibernate 中使用 IF 构造

标签 java sql hibernate hql

我在 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/

相关文章:

java - Apache Nutch 跳过 URL 并截断

java - 我可以避免使用正则表达式从 int 数组中查找整数值吗?

php - 如何知道 UNION mysql 查询中数据的来源

mysql - 生成查询以比较头对头统计数据

php - 向mysql数据库插入数据时出错

java - 删除在 Hibernate/Spring Data 中不起作用

java - 事务中的多个批量插入

java - 将字符串数组转换为列表 : double brackets

java - 使用递归将二叉搜索 TreeMap 存储到数组中并打印出来

hibernate - 如何获取 SessionFactoryImplementor 的实例?