Java 如何查询JPA中多对多关系中的实体列表?
假设我有以下两个实体:Java 如何查询JPA中多对多关系中的实体列表?,java,hibernate,jpa,Java,Hibernate,Jpa,假设我有以下两个实体: @Entity @Table(name="manifest") public class Manifest extends DbTable implements Serializable { public Manifest() { } @Id @GeneratedValue(strategy=GenerationType.IDENTITY) public Long id; @ManyToMany(cascade=CascadeT
@Entity
@Table(name="manifest")
public class Manifest extends DbTable implements Serializable {
public Manifest() { }
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Long id;
@ManyToMany(cascade=CascadeType.ALL, mappedBy="manifests",fetch= FetchType.LAZY)
public List<Thingy> thingys;
}
或
或
这三条建议中的后一条基本上是我在四处寻找的唯一建议,但没有任何效果。对于所有这三个,我认为我得到的是一个空列表(而不是一个错误)。查询是通过以下方式进行的(根据需要设置参数):
如果你知道特定的清单ID,你就不能检索该清单并从中获取内容列表吗
Manifest m = em.find(Manifest.class, manifestId);
List<Thingy> thingys = m.thingys;
Manifest m=em.find(Manifest.class,manifestId);
List thingys=m.thingys;
哦,是的,这也很有效。我想在一个类型化查询中设置它,这样我就不会将其他内容加载到内存中,也可以在数据库中对我要执行的查询进行额外过滤(OP中没有显示)。好吧,呃,哎哟,实际上第三个查询很好(可能还有第二个),我只是数据库设置不正确。
"SELECT DISTINCT d
FROM Thingy d
WHERE :manifest MEMBER OF d.manifests"
"SELECT DISTINCT d
FROM Thingy d
JOIN d.manifests m
WHERE m = :manifest"
"SELECT DISTINCT d
FROM Thingy d
JOIN d.manifests m
WHERE m.id = :manifestId"
myEntityManager
.createQuery(giantQueryStringGoesHere, Thingy.class)
.setParameter("manifest", myManifestObject)
.getResultList();
Manifest m = em.find(Manifest.class, manifestId);
List<Thingy> thingys = m.thingys;