use*_*371 2 hibernate criteria subquery
我对Hibernate Criteria不是很熟悉,如果这个问题太简单,请道歉......但是,非常感谢任何帮助!
我有两个实体,CD和Track.每张CD都有Track-objects的集合.在每个Track中都有一个名为"title"的字符串字段.现在我想使用Hibernate Criteria检索所有CD,其中"title"设置为某个值.到目前为止我所拥有的是:
//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();
Run Code Online (Sandbox Code Playgroud)
无论曲目标题如何,都会返回所有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();
Run Code Online (Sandbox Code Playgroud)
要么
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();
Run Code Online (Sandbox Code Playgroud)
您也可以避免使用子查询并简单地使用连接
Criteria cdCriteria = session.createCriteria(CD.class, "cd");
criteria.createAlias("cd.tracks", "track");
criteria.add(Restrictions.eq("track.title", "someTitle"));
criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);
Run Code Online (Sandbox Code Playgroud)