【问题标题】:JPA Criteria API find by field nested list of entitiesJPA Criteria API 按字段嵌套实体列表查找
【发布时间】:2021-01-27 09:34:59
【问题描述】:

我有包含Tag 类列表(多对多)的Certificate 类,我必须找到包含某些TagCertificates(按标签名称) 我正在使用 JPA Criteria API,但不能这样做..

@Entity
@Table(name = "gift_certificate")
public class Certificate {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String description;
    private BigDecimal price;
    private Integer duration;
    @Column(name = "create_date")
    private LocalDateTime createDate;
    @Column(name = "last_update_date")
    private LocalDateTime lastUpdateDate;
    @ManyToMany
    @JoinTable(name = "gift_certificate_tag",
            joinColumns = @JoinColumn(name = "tag_id"),
            inverseJoinColumns = @JoinColumn(name = "gift_certificate_id")
    )
    private List<Tag> tags;
    
getters and setters and other code...

.....

@Entity
@Table(name = "tag")
public class Tag {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

getters and setters and other code...

我尝试这样做,但出现异常IllegalStateException: Illegal attempt to dereference path source [null.tags] of basic type

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Certificate> query = cb.createQuery(Certificate.class);
Root<Certificate> certificates = query.from(Certificate.class);
certificates.fetch("tags", JoinType.LEFT);
query.select(certificates).distinct(true);

query.where(cb.like(certificates.get("tags").get("name"), params.getTag()));

return entityManager.createQuery(query).getResultList();

【问题讨论】:

    标签: hibernate jpa criteria-api


    【解决方案1】:

    我做到了!

       CriteriaBuilder cb = entityManager.getCriteriaBuilder();
       CriteriaQuery<Certificate> criteriaQuery = cb.createQuery(Certificate.class);
       Root<Certificate> certificates = criteriaQuery.from(Certificate.class);
    
       Join<Certificate, Tag> tags = certificates.join("tags", JoinType.LEFT);
       criteriaQuery = criteriaQuery.distinct(true).where(cb.like(tags.get("name"), params.getTag()));
    
       return entityManager.createQuery(criteriaQuery).getResultList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-08
      • 2018-10-16
      • 2017-08-22
      • 2014-11-20
      • 2018-07-04
      • 2015-08-14
      • 1970-01-01
      • 2018-01-07
      相关资源
      最近更新 更多