【问题标题】:Hibernate many-to-many: Criteria for looking up all class A which contains class BHibernate 多对多:查找所有包含 B 类的 A 类的标准
【发布时间】:2010-10-27 10:55:36
【问题描述】:

我有 2 个具有多对多关系的类。我以“问题”和“标签”为例,让案例更容易理解。

对于每个问题,您都有多个标签。与标签相同。

如果问题包含标签为“休眠”,我想做的是获取所有问题(及其相应的标签)。

我最多可以在多对多表中使用 SQLQuery 并返回问题 ID 列表。然后使用带有restrictions.in 的标准并抓住所有问题。但这太笨拙了,我敢打赌有更好的方法,是吗?

【问题讨论】:

    标签: hibernate


    【解决方案1】:

    本质上,您需要创建一个别名并使用该别名来查询子集合,如下所示:

    List questions = sess.createCriteria(Question.class)
        .createAlias("Tags", "t")
        .add( Restrictions.eq("t.name", "hibernate") )
        .list();
    

    我假设在这种情况下您实际上没有一个代表标签表的“桥”表的类,否则您需要创建 2 个别名,例如:

    List questions = sess.createCriteria(Question.class)
            .createAlias("QuestionTag", "qt")            
            .createAlias("qt.Tags", "t")
            .add( Restrictions.eq("t.name", "hibernate") )
            .list();
    

    您可以从文档中了解更多信息:

    http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querycriteria.html#querycriteria-associations

    【讨论】:

    • 我应该早点问!不敢相信它这么直接。
    • 谢谢@lomaxx,我也有同样的问题,但要求略有不同:如果我想将“qt”与 Tag 对象进行比较怎么办? (不是带有 tag.getName() 的 qt.name)
    • @smallufo:你是什么意思?你是说你有一个标签,你想将 qt.Tags 集合与那个标签进行比较?在这种情况下,您需要做 Restrictions.eq("qt.Tags.Id", tag.Id)
    • @Iomaxx ,我的意思是我想做标签的相等测试:equals() ,而不仅仅是一个属性(id 或名称)。
    • @smallufo :这不是 hibernate 可以为您处理的事情。这是java必须处理的事情
    猜你喜欢
    • 2016-11-24
    • 1970-01-01
    • 2012-12-02
    • 2017-04-19
    • 2022-12-18
    • 2021-11-14
    • 2014-01-28
    • 2014-12-06
    • 1970-01-01
    相关资源
    最近更新 更多