【问题标题】:Hibernate check equal of two unrelated column休眠检查两个不相关的列是否相等
【发布时间】:2019-02-21 09:00:52
【问题描述】:

我有如下示例实体

class Book{
  int id
  String name
  int sid
}

class Author {
   int id
   String name
   List<Book> books
   int mid
}

这不是很好的设计,我知道这只是试图解释一个场景。

现在我的问题是,有什么方法可以检查两个不相关的列是否相等

例如

session.createCriteria(Author.class, "author")
       .createAlias("books", "book")
       .add(Restrictions.eq("author.mid","book.sid")
       .list()

可以吗?

【问题讨论】:

    标签: hibernate criteria hibernate-criteria


    【解决方案1】:

    在我看来,Criteria API 不支持加入不相关的实体。尝试如下使用 HQL 而不是 Criteria API。

    session.createQuery("from Book as book INNER JOIN Author as author WHERE book.sid = author.mid").list();
    

    【讨论】:

    • 您没有on 加入的部分。此查询不起作用。更新你的答案
    【解决方案2】:

    我认为不需要 Restrictions.eq("author.mid","book.sid")。希望对您有所帮助。

    普通的Sql语句:

    SELECT A.*, B.* FROM Author A, Books b WHERE A.ID=B.id ;
    

    条件加入:

    Criteria criteria = session.createCriteria(Author.class);
        criteria.setFetchMode("books", FetchMode.JOIN)
        List list = criteria.list();
    

    如果您有进一步的限制,那么您必须添加限制

     .add(Restrictions.eq("id", 2));
    

    Example Criteria

    Subquery-Criteria

    Similar issue

    【讨论】:

    • 我确实需要它。我在这里只给出一个样本。在实际查询中 mid=sid 是必需的
    • 如果需要,我们也可以条件.add(Restrictions.eq("author.mid","book.sid")
    • 那么你的前任应该工作: session.createCriteria(Author.class, "author") .createAlias("books", "book") .add(Restrictions.sqlRestriction("author.mid", "book.sid") .list()
    【解决方案3】:

    这可能不是推荐的方式,但 Restriction.sqlRestriction 为我工作以获得所需的输出

    session.createCriteria(Author.class, "author")
           .createAlias("books", "book")
           .add(Restrictions.sqlRestriction("author.mid","book.sid")
           .list()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 2015-06-02
      • 2019-11-04
      • 1970-01-01
      • 2011-08-09
      相关资源
      最近更新 更多