Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将SQL条件添加到CriteriaQuery_Java_Jpa_Criteria Api_Criteriaquery - Fatal编程技术网

Java 将SQL条件添加到CriteriaQuery

Java 将SQL条件添加到CriteriaQuery,java,jpa,criteria-api,criteriaquery,Java,Jpa,Criteria Api,Criteriaquery,我需要向CriteriaQuery添加类似于Restrictions.sqlRestriction的内容。如何将SQL条件添加到CriteriaQuery 我的代码: CriteriaBuilder criteriaBuilder=entityManager.getCriteriaBuilder(); CriteriaQuery<Installation> criteriaQuery = criteriaBuilder.createQuery(Test.class); Root<

我需要向CriteriaQuery添加类似于Restrictions.sqlRestriction的内容。如何将SQL条件添加到CriteriaQuery

我的代码:

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

我不确定能不能做到。我建议您选择以下3个选项:

  • 在您的Hibernate实体中实现您需要做的任何事情,但我想您已经尝试过,并且正在寻找其他解决方案
  • 将整个查询重新编写为SQL
  • 一个更具创造性的方法是:在数据库视图上定义一个新的Hibernate实体,执行查询的“微妙”部分,其余部分由条件管理
JPA标准允许使用
function()
,或具有JPQL等价物的其他子句。既然您没有说什么是“SQL条件”,那么就只能说这些了。您当然不能将一些随机SQL转储到JPQL筛选器中,例如,我的案例的解决方案(调用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=em.createQuery(criteriaQuery.select(root));
query.setParameter(“状态”,1L);

我需要在int字段中使用Oracle SQL函数“bitand”,因此使用JPA 2.1“function”关键字,可通过CriteriaBuilder获得,这样您就不需要“SQL”了
   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);