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



我需要执行表单的查询

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

不安全的方法将是

String qStr = "SELECT foo FROM Bar b WHERE " + x " = " + y " AND " + expr

但是,x 和 y 不是受信任的来源,因此容易受到注入攻击。我找到了 CriteriaBuilder,并制作了"x = y"部分的编程构建,该部分工作正常,但找不到如何附加"AND 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 的表达式、谓词、查询等。

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

如果需要 OR,可以使用析取。

像这样:

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

最新更新