【问题标题】:Hibernate Criteria collection property (subquery?)Hibernate Criteria 集合属性(子查询?)
【发布时间】:2012-01-29 05:04:15
【问题描述】:

我对Hibernate Criteria不是很熟悉,如果这个问题太简单了,请道歉......但是,非常感谢任何帮助!

我有两个实体,CD 和 Track。每张 CD 都有轨道对象的集合。在每个 Track 中都有一个名为“title”的字符串字段。现在我想使用 Hibernate Criteria 检索所有具有“标题”设置为特定值的 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,无论曲目标题如何。有人有什么建议吗?

提前谢谢你。

【问题讨论】:

    标签: hibernate subquery criteria


    【解决方案1】:

    您已经非常接近解决方案了。您只是错过了限制说明,该曲目必须是 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);
    

    【讨论】:

    • 谢谢!我设法让你的最后一个解决方案工作,加入。另外两个因映射异常而失败,未知实体:null 我相信这是因为“track.cd”,因为“cd”不是 Track 中的字段。该关系仅从 CD 到 Track 是定向的。还是我在这里打错了?
    • 不,你是对的。我假设关联是双向的,并且轨道有一个 cd 字段。
    • 那么,用子查询是不可能解决的?由于关联不是双向的,唯一的方法是使用连接?
    • 鉴于您需要访问 CD 的曲目,我不明白如何避免 CD 和曲目之间的连接。
    • 上述答案的这一行中缺少双引号,但 StackOverflow 不允许我修复它(显然,最小编辑长度必须为 6 个字符):criteria.createAlias("cd.轨道“,轨道”);
    【解决方案2】:

    您实际上可以在没有连接的情况下执行此操作 - 只需使用 cdCriteria.getAlias() 替换别名的字符串值。因此,关键行将是:

    trackCriteria.add(Restrictions.propertyEq("trackCd.id", cdCriteria.getAlias() + ".id"));
    

    【讨论】:

    • 这使用休眠内部别名,而不是用户定义的别名。
    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2012-02-15
    • 2015-03-03
    • 2019-04-01
    相关资源
    最近更新 更多