0

我需要执行表单的查询

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。

4

1 回答 1

0

使用条件 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);
于 2012-05-14T10:07:37.600 回答