我正在使用Spring Data JPA规范对我的实体进行通用查询。到目前为止,它运作良好。现在,当我尝试在通过embeddedId注释使用的复合键上使用这些问题时,问题就出现了。所以在这里我需要使用嵌套属性来查询哪个对象是Foo并且我正在尝试通过id编写标准。例如id1。
@Entity
@Data
public class Foo implements Serializable {
private static final long serialVersionUID = 1L;
/** The key. */
@EmbeddedId
private FooKey id;
}
@Embeddable
@Data
public class FooKey implements Serializable {
private static final long serialVersionUID = 1L;
/** The key. */
private String id1;
private String id2;
}
在我正在尝试的规范中
@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
// get root type
root.get(property).getJavaType()
但是这对于嵌套属性不起作用,就像在这种情况下一样。有没有什么办法可以为复合键中的属性构建谓词。
答案 0 :(得分:7)
等于的例子:
@Override
public Predicate toPredicate(Root<Foo> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
builder.equal(root.get("id").get("id1"),"my val");
答案 1 :(得分:1)
如果要使用多个级别,可以构建类似的功能。以我的经验,两个级别绰绰有余。但是取决于你。
protected Path<Comparable> getPath(Root<EntityOrModel> root) {
Path<Comparable> path;
if (criteria.getKey().contains(".")) {
String[] split = criteria.getKey().split("\\.");
int keyPosition = 0;
path = root.get(split[keyPosition]);
for (String criteriaKeys : split) {
if (keyPosition > 0) {
path = path.get(criteriaKeys);
}
keyPosition++;
}
} else {
path = root.get(criteria.getKey());
}
return path;
}
然后设置
@Override
public Predicate toPredicate(Root<EntityOrModel> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
Path<Comparable> path = getPath(root);
// ...
return builder.equal(path, value)
}