带有“in”表达式的JPA标准API转换为多个“OR”而不是“in”
e. g.
我的主要模型
public class Person {
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "department_id")
private Department department;
...
}
多对一关系
public class Department {
@Id
@Column(name="department_id")
private Integer departmentId;
@OneToMany(mappedBy="department")
private List<Person> person;
...
}
在持久性中定义了这两个模型。xml(注意:它没有指定任何db方言)
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="primary" transaction-type="JTA">
<jta-data-source>java:openejb/Resource/jdbc/myDS</jta-data-source>
<class>com.xyz.Person</class>
<class>com.xyz.Department</class>
...
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="openjpa.Log" value="${open.jpa.log}" />
<property name="openjpa.ConnectionFactoryProperties" value="printParameters=true" />
<property name="openjpa.RuntimeUnenhancedClasses" value="unsupported" />
</properties>
</persistence-unit>
</persistence>
以下是用于构建查询的带条件API的代码:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> criteriaQuery = cb.createQuery(Person.class);
Root<Person> personRoot = criteriaQuery.from(Person.class);
criteriaQuery.select(personRoot);
List<Predicate> predicateList = new ArrayList<>();
predicateList.add(personRoot.get(Person_.department).get(Department_.departmentId).in(Arrays.asList(1, 2, 3)));
// Using list because I actually need to add multiple conditions
criteriaQuery.where(predicateList.toArray(new Predicate[0]));
TypedQuery<Person> searchQuery = em.createQuery(criteriaQuery);
searchQuery.getResultList();
这将以以下格式打印查询:
SELECT t0.person_id, ...
FROM person t0
WHERE ((t0.department_id = ? OR t0.department_id = ? OR t0.department_id = ?) AND t0.department_id IS NOT NULL)
但我应该得到的是
SELECT t0.person_id, ...
FROM person t0
WHERE t0.department_id IN (?, ?, ?)
环境:
更新:
我也试着添加如下mariadb方言,但没有帮助
<property name="openjpa.jdbc.DBDictionary" value="mariadb" />
解决方案是使用表达式,例如:
List<Long> departmentIdsList = new ArrayList();
departmentIdsList.add(1L);
departmentIdsList.add(2L);
departmentIdsList.add(3L);
Expression<Long> exp = personRoot.get("departmentId");//"departmentId" field name to be equated
predicateList.add(exp.in(departmentIdsList));
上面的片段应该按照子句中的方式进行评估
我正在尝试执行以下操作(cb=CriteriaBuilder): 但我得到以下语法错误: 绑定不匹配:(表达式之间的泛型方法 是否可以转换表达式
但是,直接在上调用似乎没有得到所需的结果。如果直接使用实体是不可能的,我希望有某种可以表示多个列,然后这些列可以作为调用的接收方,但我没有找到任何。 那么,问题是:一个人如何正确地做到这一点呢?还是在JPA中根本不可能?或者只是Eclipselink中存在一个bug?
我是jpa的新手,需要这样的东西: 我能修好它吗?
我试图将js代码转换为java版本,但对正则表达式有点困惑:在js中,我有一个类似于:testString的表达式。拆分(“/(\w*\d)/g”) 我可以在java中使用什么等效语言?我试着用匹配器得到同样的结果。find()和split函数,但结果不一样。
本文向大家介绍将中缀转换为后缀表达式,包括了将中缀转换为后缀表达式的使用技巧和注意事项,需要的朋友参考一下 前缀表达式是人类可读和可解的。我们可以轻松地区分算子的顺序,也可以在计算数学表达式时先使用括号将其求解。计算机无法轻松地区分运算符和括号,这就是为什么需要后缀转换的原因。 要将中缀表达式转换为后缀表达式,我们将使用堆栈数据结构。通过从左到右扫描infix表达式,当我们得到任何操作数时,只需将