【问题标题】:hibernate criteria - querying tables in n:m relationship休眠条件 - 在 n:m 关系中查询表
【发布时间】:2009-01-02 19:06:29
【问题描述】:

我正在尝试使用休眠条件为以下场景构建查询:

  • 两个实体:指标和报告(每个都有自己的表格、类等)
  • 一个指标可用于零到多个报告中
  • 报告使用零到多个指标
  • 因此,我有一个交集表来存储关系
  • 在两个类及其休眠映射中都定义了关系
  • 在 UI 中,用户可以选择一个或多个报告(除其他外),我想在数据库中查询这些报告中使用的指标

我尝试了以下方法:

criteria.add(Restrictions.in("Reports", selectedReports));

但我得到的只是一个奇怪的 SQL 语句

where this_.Indicator_ID in (?)

然后是 JDBC 异常(缺少参数)

有什么想法吗?谢谢。

注意:我已经查看了 Querying ManyToManyrelationship with Hibernate Criteria,但接受的解决方案是构建自定义 sql-string ...

【问题讨论】:

    标签: hibernate many-to-many criteria


    【解决方案1】:
      Criteria c = session.createCriteria(Indicator.class);
        c.add(Restrictions.eq("someField", myObject).createCriteria("reports")
        .add(Restrictions.eq("reportName", name);
        c.list();
    

    您需要为保存在某个其他实体的集合中的实体创建子标准。

    String[] selectedReportsId = {"1", "2", "3"};
     c.add(Restrictions.eq("someField",myObject).createCriteria("reports")
        .add(Restrictions.in("id", selectedReportsId);
    

    然后从这里查看有关转换结果的信息: https://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/querycriteria.html#querycriteria-associations

    此外,这可能会阐明您可以根据标准做什么: http://www.hibernate.org/hib_docs/v3/api/org/hibernate/criterion/Restrictions.html

    【讨论】:

    • 好的,这允许我查询报表类的字段 - 到了一半!但我有一个 Collection selectedReports 我想在我的查询中使用..
    • 感谢您的链接.. 有什么方法可以直接使用我的 Collection?对于多对一属性(例如所有者),我可以简单地使用 criteria.add(Restrictions.in("Owner", selectedOwners));
    • 没有新消息..我想我会接受这个答案。感谢您的帮助!
    • “querycriteria-associations”链接现在返回 404。
    【解决方案2】:

    如果您必须这样做,以下是 Google 在搜索“hibernate hql 多对多”后返回的一些建议:

    http://patf.net/blogs/index.php?blog=2&c=1&more=1&pb=1&tb=1&title=many_to_many_in_hql

    来自 Hibernate 论坛:

    http://forum.hibernate.org/viewtopic.php?p=2340747&sid=d4c8d2fcc16aed0201f73eb74619692a

    来自 Spring 论坛:

    http://forum.springframework.org/showthread.php?t=36870

    希望这些帮助。

    【讨论】:

    • 感谢您的链接,但我正在尝试使用标准(不是 HQL)。我试过谷歌,但到目前为止没有成功......
    • 您在使用 Criteria 时正在使用 HQL,因为它在后台使用 HQL:developer.com/java/ent/article.php/3322131
    • 这可能是真的,但我正在尝试编写的代码并没有直接使用 HQL。我可能会扩大限制,但我想看看在不恢复直接 HQL(或 SQL)的情况下,我能在 Criteria 上走多远。
    • 很好,对不起,我没有更多帮助。我希望其他人可以回答 - 我们都会学到一些东西。祝你好运。
    • 如果我想出点什么我会发帖的。zmf 似乎在正确的轨道上。无论如何谢谢:-)
    【解决方案3】:

    目前,这就是我让它工作的方式(感谢 zmf)。

    Criteria subcrit = criteria.createCriteria("Reports");
    Disjunction dis = Restrictions.disjunction();
    for (Reports r : selectedReports) {
        dis.add(Restrictions.idEq(r.getID()));
    }
    subcrit.add(dis);
    

    这几乎正是 zmf 所建议的,我添加的只是从传递的 Collection 构建标准的析取。

    剩下要做的就是尝试直接使用集合...

    【讨论】:

      猜你喜欢
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 2017-03-21
      • 1970-01-01
      相关资源
      最近更新 更多