【问题标题】:Jpa Criteria for ManyToMany and OneToOne relationships多对多和一对一关系的 Jpa 标准
【发布时间】:2016-03-15 10:46:28
【问题描述】:

我有 3 个 POJO 类 - Link、LinkDetails 和 Tag。 Link和LinkDetails的关系——OneToOne,LinkDetails和Tag的关系——ManyToMany。

如何使用Jpa Criteria,查找具有指定标签名称的链接列表?

@Entity
public class Link extends AbstractEntity {

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

    @Column
    private String url;

    @OneToOne(cascade = CascadeType.ALL)
    @PrimaryKeyJoinColumn
    private LinkDetails linkDetails;
}

@Entity
public class LinkDetails extends AbstractEntity {

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

    @Column
    private String description;

    @JoinTable(name = "link_details_2_tag", joinColumns = { @JoinColumn(name = "link_details_id")}, inverseJoinColumns = { @JoinColumn(name = "tag_id") })
    @ManyToMany(targetEntity = Tag.class, fetch = FetchType.LAZY)
    private Set<Tag> tags = new TreeSet<Tag>();

}

@Entity
public class Tag extends AbstractEntity {

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

    @Column
    private String name;
}

【问题讨论】:

  • 您的标准代码在哪里?这里有带有示例的文档docs.oracle.com/javaee/6/tutorial/doc/gjivm.html
  • 我已经找到了解决方案。现在它将添加它
  • 我已经标记了这个问题,因为它不会询问任何不包括在标准 api 的基本使用中的内容。该案例完全包含在文档中。它对其他用户没有用。

标签: java jpa many-to-many criteria-api one-to-one


【解决方案1】:
@Override
public List<Link> getLinksByTag(String tag){

    CriteriaBuilder cBuilder = getEntityManager().getCriteriaBuilder();
    CriteriaQuery<Link> criteria = cBuilder.createQuery( Link.class );
    Root<Link> linkRoot = criteria.from( Link.class );
    Join<Link, LinkDetails> linkDetailsJoin = linkRoot.join(Link_.linkDetails);
    Join<LinkDetails, Tag> tagJoin = linkDetailsJoin.join(LinkDetails_.tags);
    criteria.select(linkRoot);
    criteria.where(cBuilder.equal(tagJoin.get(Tag_.name), tag));
    TypedQuery<Link> query = getEntityManager().createQuery(criteria);
    return query.getResultList();
}

【讨论】:

    猜你喜欢
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多