JPA标准多对多和OneToOne关系
问题描述:
我有3个POJO类 - 链接,LinkDetails和标签。 LinkDetails和LinkDetails之间的关系 - OneToOne,LinkDetails和Tag之间的关系 - ManyToMany。JPA标准多对多和OneToOne关系
如何使用JPA标准,找到与特定的标记名称的链接列表?
@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;
}
答
@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();
}
哪里是你的标准码?还有就是在这里https://docs.oracle.com/javaee/6/tutorial/doc/gjivm.html – carbontax
实例文档,我已经找到了解决办法。现在它会添加它 – Sined
我已经标记了这个问题,因为它没有询问任何未被标准API基本使用所涵盖的内容。该案件完全由文件覆盖。这对其他用户无用。 – carbontax