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

时间:2012-05-14 08:01:45

标签: java jpa jpql

我需要执行表格

的查询
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);

有什么想法吗?我花了很多时间查看教程和表达式,谓词,查询等的javadoc。

1 个答案:

答案 0 :(得分:1)

使用条件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);