我需要创建一个"真正的"动态JPA CriteriaBuilder.我得到Map<String, String>了陈述.看起来像:
name : John
surname : Smith
email : email@email.de
...more pairs possible
Run Code Online (Sandbox Code Playgroud)
这是我实现的:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> query = cb.createQuery(User.class);
Root<User> userRoot = query.from(User.class);
query.select(userRoot);
List<Predicate> predicates = new ArrayList<Predicate>();
Iterator<String> column = statements.keySet().iterator();
while (column.hasNext()) {
// get the pairs
String colIndex = column.next();
String colValue = statements.get(colIndex);
// create the statement
Predicate pAnd = cb.conjunction();
pAnd = cb.and(pAnd, cb.equal(userRoot.get(colIndex), colValue));
predicates.add(pAnd);
}
// doesn't work, i don't know how many predicates …Run Code Online (Sandbox Code Playgroud) 我的理解是,使用Spring数据JPA我不能有一个查询方法来获取列等于给定的非null方法参数的所有行,并且当method参数为null时,使用相同的方法获取此列为NULL的所有行.
那是对的吗?
所以我必须在我的JAVA代码中区分它,我必须使用一个单独的查询方法显式询问空值,如下例所示?
// Query methods
List<Something> findByParameter(Parameter parameter);
List<Something> findByParameterIsNull();
...
List<Something> result = new ArrayList<>();
if (parameter == null)
result = findByParameterIsNull();
else
result = findByParameter(parameter);
Run Code Online (Sandbox Code Playgroud)
这很糟糕,如果我有4个参数可以为null并且必须编码16种不同的查询方法.
正如标题所说.
我基本上会喜欢这样的请求
/api/todos/?completed=eq.true&created_at=lt.1486462109399
Run Code Online (Sandbox Code Playgroud)
有没有准备好spring way实现这样的?类似于Page/Pageable机制的东西会很棒.
如果没有,我想我可以使用Hibernate Criteria Queries&Argument Re-solvers来实现它.基本上允许我写我的控制器像
@GetMapping
public ResponseEntity<Page<TodoDTO>> listAll(Criteria criteria, Pageable pageable)
{
Page<Todo> todos = todoService.listAll(criteria, pageable)
...
}
Run Code Online (Sandbox Code Playgroud)
自定义参数解析器将负责将查询字符串转换为条件.我还不确定如何在服务中处理它,但这是我试图实现它的方向.
这会是一个好方法吗?有什么建议?(所有假设已经没有现成的机制).
非常感谢您的帮助.
java ×3
criteria-api ×1
filter ×1
hibernate ×1
jpa ×1
jpa-2.0 ×1
null ×1
parameters ×1
rest ×1
spring ×1