Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 多对多实体属性的休眠条件 @实体 甲级{ @许多 私人名单; ... } @实体 B类{ ... }_Hibernate_Many To Many_Criteria - Fatal编程技术网

Hibernate 多对多实体属性的休眠条件 @实体 甲级{ @许多 私人名单; ... } @实体 B类{ ... }

Hibernate 多对多实体属性的休眠条件 @实体 甲级{ @许多 私人名单; ... } @实体 B类{ ... },hibernate,many-to-many,criteria,Hibernate,Many To Many,Criteria,我希望使用条件(而不是sql查询)从类中获取列表。有可能这样做吗?在这种情况下,投影不起作用。您应该能够调用(假设a是a的实例) 如果已使用适当的getter setter设置了类。我不认为需要查询条件。不幸的是,条件只允许选择根实体,而不允许选择任何连接的实体。因此,如果你的人数是双向的,那就容易多了。您可以使用与 a.getList(); 如果这不是一个选项,我认为唯一的方法是使用子查询,从而将标准编码为 select b from B b inner join b.as a where

我希望使用条件(而不是sql查询)从类中获取列表。有可能这样做吗?在这种情况下,投影不起作用。

您应该能够调用(假设a是a的实例)


如果已使用适当的getter setter设置了类。我不认为需要查询条件。

不幸的是,条件只允许选择根实体,而不允许选择任何连接的实体。因此,如果你的人数是双向的,那就容易多了。您可以使用与

a.getList();
如果这不是一个选项,我认为唯一的方法是使用子查询,从而将标准编码为

select b from B b inner join b.as a where a = :theA
因此,代码如下所示:

select b from B b where b.id in (select b2.id from A a inner join a.list b2 where a.id = :theAId)

这并不是因为你可以用对象来做这件事,所以用SQL/HQL/Criteria查询来做这件事是没有用的,例如性能问题……还要注意,IN语句有时会受到SGDB的限制(例如,我认为在Oracle中,我们只能在IN语句中输入1000个值)。也许您最好运行一个单独的查询来获取列表,然后将其拆分为子列表(guava分区函数?),并对所有子列表重新运行子查询。在本例中,in语句使用子查询,而不是文本值列表。在这种情况下,对子查询返回的项目数没有任何限制。
select b from B b where b.id in (select b2.id from A a inner join a.list b2 where a.id = :theAId)
Criteria c = session.createCriteria(B.class, "b");

DetachedCriteria dc = DetachedCriteria.forClass(A.class, "a");
dc.createAlias("a.list", "b2");
dc.add(Restrictions.eq("a.id", theA.getId()));
dc.setProjection(Projections.property("b2.id"));

c.add(Subqueries.propertyIn("b.id", dc));