【问题标题】:Add SQL condition to CriteriaQuery向 CriteriaQuery 添加 SQL 条件
【发布时间】:2014-07-15 12:05:59
【问题描述】:

我需要向 CriteriaQuery 添加类似 Restrictions.sqlRestriction 的内容。如何在 CriteriaQuery 中添加 SQL 条件?

我的代码:

CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery<Installation> criteriaQuery = criteriaBuilder.createQuery(Test.class);
Root<Installation> root = criteriaQuery.from(Test.class);
criteriaQuery.select(root);

【问题讨论】:

    标签: java jpa criteria-api criteriaquery


    【解决方案1】:

    我不确定是否可以做到。我建议你这 3 个选项:

    • 在您的 Hibernate 实体中实现您需要做的任何事情,但我想您已经尝试过并且正在这里寻找其他解决方案
    • 将整个查询重写为 SQL
    • 更有创意:在数据库视图上定义一个新的 Hibernate 实体,执行查询的“精细”部分,其余部分通过 Criteria 进行管理。

    【讨论】:

      【解决方案2】:

      JPA Criteria 允许使用 function() 或其他具有 JPQL 等效项的子句。既然你没有说什么是“SQL 条件”,那么这就是所有可以说的。例如,您当然不能将一些随机 SQL 转储到 JPQL 过滤器中

      【讨论】:

      • 我需要对 int 字段使用 Oracle SQL 函数 'bitand'
      • 所以使用 JPA 2.1“function”关键字,可通过 CriteriaBuilder 获得,这样您就不需要“SQL”了
      【解决方案3】:

      我的案例的解决方案(调用 Oracle 函数 'bitand')

         criteriaQuery.where(criteriaBuilder.notEqual(criteriaBuilder.function("bitand", Long.class, root.get(Test_.status).get(Status_.id), criteriaBuilder.parameter(Long.class, "status")),0));
         TypedQuery<Installation> query = em.createQuery(criteriaQuery.select(root));
         query.setParameter("status", 1L);
      

      【讨论】:

        猜你喜欢
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 2018-10-02
        • 1970-01-01
        • 2013-07-11
        • 2021-10-04
        • 1970-01-01
        • 2018-04-13
        相关资源
        最近更新 更多