【问题标题】:Spring jpa criteriaBuilder search in a listSpring jpa criteriaBuilder 在列表中搜索
【发布时间】:2016-01-18 11:01:06
【问题描述】:

我有一个包含作者列表的书籍类:

@Entity
@Table(name = "book")
public class Book extends Content {

    @ManyToMany(fetch = FetchType.LAZY)
    private List<Author> authors;
...}

现在,这是我的BookSpecifications 课程:

public static Specification<Book> authorIdIs(Long authorId) {
    return new Specification<Book>() {
        @Override
        public Predicate toPredicate(Root<Book> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
            return cb.isTrue(root.get("authors").get("id").in(authorId));
        }
    };
}

如何检查给定的authorId 是否在列表中?

错误:

java.lang.IllegalStateException: Illegal attempt to dereference path source [null.authors] of basic type
    at org.hibernate.jpa.criteria.path.AbstractPathImpl.illegalDereference(AbstractPathImpl.java:98) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
    at org.hibernate.jpa.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:191) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final]
    at com.tarameshgroup.derakht.service.specs.BookSpecifications$3.toPredicate(BookSpecifications.java:40) ~[classes/:na]
    at org.springframework.data.jpa.domain.Specifications$ComposedSpecification.toPredicate(Specifications.java:189) ~[spring-data-jpa-1.9.2.RELEASE.jar:na]

【问题讨论】:

  • 我不是说我会帮忙,但是你能详细说明你是如何使用它的吗?这对我来说是一个新结构,所以我不知道Specification 来自哪里以及如何执行它......在我看来,根未正确初始化请参阅[null.authors] 中的null ,但它不是真正的 NPE...
  • 好的,我找到了一些教程 - spring.io/blog/2011/04/26/… ...
  • @Betlista 我的问题是在列表中搜索,
  • 应该类似于builder.equal(root.get("authors").get("id").as(Long.class), authorId)

标签: java spring hibernate jpa java-persistence-api


【解决方案1】:

为此,您可以将 Join 与谓词一起使用:

参考以下代码,

public static Specification<Book> authorIdIs(Long authorId) {
    return new Specification<Book>() {
        @Override
        public Predicate toPredicate(Root<Book> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
                Join join = root.join("authors");                   
                return cb.equal(join.get("id"),authorId);
        }
    };
}

【讨论】:

  • @Harsahl 如果我还需要选择作者属性怎么办?我认为加入不会自动选择 *.authors。
  • @zt1983811 所以你只需要在 join 中获取这些属性。
猜你喜欢
  • 2018-10-17
  • 2019-04-10
  • 1970-01-01
  • 2014-08-15
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
相关资源
最近更新 更多