2016-03-15 99 views
2

我有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; 
} 
+0

哪里是你的标准码?还有就是在这里https://docs.oracle.com/javaee/6/tutorial/doc/gjivm.html – carbontax

+0

实例文档,我已经找到了解决办法。现在它会添加它 – Sined

+0

我已经标记了这个问题,因为它没有询问任何未被标准API基本使用所涵盖的内容。该案件完全由文件覆盖。这对其他用户无用。 – carbontax

回答

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(); 
}