我需要执行表单的查询
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。