【问题标题】:Can we build Spring Data JPA specification out of a composite key attribute我们可以从复合键属性中构建 Spring Data JPA 规范吗
【发布时间】:2016-04-01 13:06:41
【问题描述】:

我正在使用 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()

但这不适用于这种情况下的嵌套属性。有什么方法可以为复合键中的属性构建谓词。

【问题讨论】:

  • FWIW 没有“Spring Data JPA 谓词”之类的东西;这是一个 JPA 标准谓词。 Spring Data JPA != JPA
  • 是的,感谢您的更正

标签: spring jpa spring-data-jpa


【解决方案1】:

相等的例子:

     @Override
     public Predicate toPredicate(Root<Foo> root, CriteriaQuery<?> query, CriteriaBuilder builder) { 
     builder.equal(root.get("id").get("id1"),"my val");

【讨论】:

  • 是的,谢谢只是在尝试,但似乎我的正则表达式是错误的,并没有真正拆分道具:) 刚刚发现
【解决方案2】:

如果您想使用多个级别,可以构建这样的函数。以我的经验,2个级别绰绰有余。但取决于你。

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)
}

【讨论】:

    猜你喜欢
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 2014-12-10
    • 2016-02-17
    • 2017-01-12
    • 2019-05-25
    • 1970-01-01
    相关资源
    最近更新 更多