Java JPA查询-如何混合任意查询字符串和CriteriaBuilder

Java JPA查询-如何混合任意查询字符串和CriteriaBuilder,java,jpa,jpql,Java,Jpa,Jpql,我需要对表单执行查询 SELECT dontcare FROM Bar b WHERE x = y AND expr x是条形图中任何字段的名称,y是特定值。这些是通过Servlet实现的,不可信任。 expr是一个特定于项目的过滤器,用于更改涉及其他字段的查询范围-这是可信的,来自配置文件,可能非常复杂。 一种不安全的方法是 String qStr = "SELECT foo FROM Bar b WHERE " + x " = " + y " AND " + expr 然而,x和y不是可

我需要对表单执行查询

SELECT dontcare FROM Bar b WHERE x = y AND expr
x是条形图中任何字段的名称,y是特定值。这些是通过Servlet实现的,不可信任。 expr是一个特定于项目的过滤器,用于更改涉及其他字段的查询范围-这是可信的,来自配置文件,可能非常复杂。 一种不安全的方法是

String qStr = "SELECT foo FROM Bar b WHERE " + x " = " + y " AND " + expr
然而,x和y不是可信的源,所以容易受到注入攻击。我找到了CriteriaBuilder,并对x=y部分进行了编程构建,该构建工作正常,但找不到如何附加和expr

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaBuilder<Bar> q = cb.createQuery(Foo.class);
Root<Bar> root = q.from(Bar.class);
Predicate p1 = cb.equals(root.get(x), y);
Predicate p2 = <====== help needed here, how can I use expr
q.where(cb.and(p1, p2));
Query query = em.createQuery(q);

有什么想法吗?我花了大量时间阅读了有关表达式、谓词、查询等的教程和javadocs。

使用criteria api,您可以创建连词,其中包含许多必须为真的谓词

如果需要或,可以使用析取

比如:

Criteria crit = session.createCriteria(Product.class);
Conjunction conjunction = Restrictions.conjunction();
conjunction.add(Restrictions.isNull("location"));
conjunction.add(Restrictions.eq("location", ""));
crit.add(conjunction);

那是冬眠而不是JPA吗?我找不到类限制或连词…是的,你是对的,但我的印象是JPA类似;查看这两个链接了解更多信息:CriteriaBuilder显然有方法连接和析取。我认为您可以使用方法和谓词。。。限制和/或预测。。。CriteriaBuilder的限制谢谢,我已经检查过了,但是仍然找不到任何东西可以将像b.z=1和b.f=2或b.f=3这样的字符串转换成CriteriaBuilder可以使用的形式…Owkee,我想我现在明白你的问题了。我认为您可以通过使用javax.persistence.Query和方法setParameterjava.lang.String name、java.lang.Object value来做您想做的事情,而不仅仅是将字符串粘贴在一起或使用Criteria api;创建查询字符串,附加配置的表达式,然后从查询的第一部分设置参数。有了CriteriaBuilder,我认为你不能做你想做的事。