Hibernate Criteria集合属性(子查询?)
我对Hibernate Criteria不是很熟悉,并且如果这个问题太简单了,我表示歉意......但是,非常感谢任何帮助!
我有两个实体,CD和Track。 每张CD都有音轨对象的集合。 在每个轨道中都有一个名为“title”的字符串字段。 现在我想要使用Hibernate Criteria检索所有具有“title”设置为特定值的Track的CD。 我到目前为止是这样的:
//session handling
Criteria cdCriteria = session.createCriteria(CD.class);
DetachedCriteria trackCriteria = DetachedCriteria.forClass(Track.class);
trackCriteria.add(Restrictions.eq("title", "SomeTitle"));
trackCriteria.setProjection(Projections.property("title"));
criteria.add(Subqueries.exists(trackCriteria));
List<CD> cds = criteria.list();
这将返回所有CD,无论曲目标题如何。 有人有任何建议吗?
先谢谢你。
你非常接近解决方案。 您刚刚错过了该曲目的限制说明,该曲目必须是CD的曲目:
Criteria cdCriteria = session.createCriteria(CD.class, "cd");
DetachedCriteria trackCriteria = DetachedCriteria.forClass(Track.class, "track");
trackCriteria.add(Restrictions.eq("track.title", "SomeTitle"));
trackCriteria.add(Restrictions.propertyEq("track.cd.id", "cd.id"));
trackCriteria.setProjection(Projections.property("track.title"));
criteria.add(Subqueries.exists(trackCriteria));
List<CD> cds = criteria.list();
要么
Criteria cdCriteria = session.createCriteria(CD.class, "cd");
DetachedCriteria trackCriteria = DetachedCriteria.forClass(Track.class, "track");
trackCriteria.add(Restrictions.eq("track.title", "SomeTitle"));
trackCriteria.createAlias("track.cd", "trackCd");
trackCriteria.add(Restrictions.propertyEq("trackCd.id", "cd.id"));
trackCriteria.setProjection(Projections.property("track.title"));
criteria.add(Subqueries.exists(trackCriteria));
List<CD> cds = criteria.list();
你也可以避开子查询并简单地使用连接
Criteria cdCriteria = session.createCriteria(CD.class, "cd");
criteria.createAlias("cd.tracks", "track");
criteria.add(Restrictions.eq("track.title", "someTitle"));
criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);
您可以在没有连接的情况下实际执行此操作 - 只需使用alias的字符串值的cdCriteria.getAlias()位置即可。 因此,关键路线是:
trackCriteria.add(Restrictions.propertyEq("trackCd.id", cdCriteria.getAlias() + ".id"));
链接地址: http://www.djcxy.com/p/36981.html