【问题标题】:Is there a way to return Specifications for Parent Entity for org.springframework.data.jpa.domain.Specification?有没有办法为 org.springframework.data.jpa.domain.Specification 返回父实体的规范?
【发布时间】:2019-01-17 23:47:26
【问题描述】:

假设我与 Person 实体有一个双向 1-1 关联

@Entity
public class Person {
  @OneToOne(optional=false)
  @JoinColumn(name = "contact_id")
  private Contact contact;


  // getters/setters/constructors
}

以及联系实体

@Entity
public class Contact {
  @OneToOne(mappedBy="contact")
  private Person person;

  // getters/setters/
}

我找不到使用联系人实体为人员实体选择父对象的方法。就这样……

criteriaQuery.select(root.get(Contact_.person));

我收到此错误:

不兼容的类型。必选 的捕获,但 'get' 被推断为 Path:不存在类型变量的实例,因此 Person 符合捕获 ?

有没有办法做到这一点?我想使用 Contact 根返回 Person Entity 的谓词。例如。

public static Specification<Person> phoneWithCountryCode(String countryCode) {
    return new Specification<Person>() {
        @Override
        public Predicate toPredicate(
            Root<Contact> root,
            CriteriaQuery<?> criteriaQuery,
            CriteriaBuilder criteriaBuilder
        ) {
            String startsWithPattern = countryCode + "%";
            criteriaQuery.select(root.get(Contact_.person));
            return criteriaBuilder.like(
                root.get(Contact_.phone), startsWithPattern
            );
        }
    };
}

【问题讨论】:

  • 显示所有代码
  • 这只是一个示例代码。规范的方法有点像更新后的问题。

标签: java hibernate entity jpa-criteria


【解决方案1】:

是的,你可以做到。 我做到了。我有关系(书——评论)。

在您的情况下,创建 Specification&lt;Person&gt; 并使用 join 与联系人。 像这样,

Join joins = root.join("contact");

如果需要帮助,请按照我的代码进行操作。

public class BookSpecification {

    public static Specification<Book> getBookByNameAndReviewId(){

        return new Specification<Book> () {

            @Override
            public Predicate toPredicate(Root<Book> root, CriteriaQuery<?> query, CriteriaBuilder cb) 
            {
             //List<javax.persistence.criteria.Predicate>
            List<Predicate> predicates = new ArrayList<>();
            predicates.add(cb.equal(root.get("name"), "spring boot"));
            Join joins = root.join("reviews");
            predicates.add(cb.equal(joins.get("no") , 584));

                return cb.and(predicates.toArray(new Predicate[predicates.size()]));
            // return cb.equal(root, predicates);
            }

        };
    }
}

【讨论】:

  • 我实际上是在尝试使用我已经拥有的反向属性来返回父对象。您的示例使用依赖对象来加入依赖对象。我也是这样做的,但我只是好奇我是否可以那样做——就像在 JDOQL 中一样
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2019-11-21
  • 2016-05-03
  • 1970-01-01
相关资源
最近更新 更多