【问题标题】:How to join Multiple tables using hibernate criteria where entity relationship is not direct?如何在实体关系不直接的情况下使用休眠条件连接多个表?
【发布时间】:2016-06-26 18:32:48
【问题描述】:

我有三个实体。它们是:

@Entity
public class Organization {
    @Id
    private long id;
    @Column
    private String name;
}
@Entity
public class Book {
    @Id
    private Long id;
    @Column
    private String name;
    @ManyToOne
    private Organization organization;
}
@Entity
public class Account  {
   @Id
   private Long id;
   @Column
   private String name;
   @ManyToOne
   private Book book;
}

在这三个实体中,我想执行以下 sql:

SELECT acc.name, acc.id
FROM account acc
JOIN book b on acc.book_id = b.id
JOIN organization org on b.organization_id = org.id
WHERE org.name = 'XYZ'

在这种情况下,Account 实体与Organization 实体没有直接关系。 Account 实体通过Book 建立关系。如何使用休眠条件动态查询来实现这一点?

【问题讨论】:

    标签: java sql join hibernate-criteria


    【解决方案1】:

    另一种方式

    public List<Account> getAccountListByOrgName(String name){
        return sessionFactory.getCurrentSession().createCriteria(Account.class)
                    .createAlias("book", "book")
                    .createAlias("book.organization", "organization")
                    .add(Restrictions.eq("organization.name", name))
                    .list();
    }
    

    【讨论】:

    • 对于相同的实体,如果我想返回组织列表我应该怎么做?
    【解决方案2】:

    你可以这样做:

    Criteria accountCriteria = getCurrentSession().createCriteria(Account.class,"acc");
    Criteria bookCriteria =  accountCriteria .createCriteria("book","b");
    Criteria orgCriteria =  bookCriteria.createCriteria("organization","org");
    orgCriteria.add(Restrictions.eq("name", "XYZ"));
    
    ProjectionList properties = Projections.projectionList();
    properties.add(Projections.property("name"));
    properties.add(Projections.property("id"));
    
    accountCriteria.setProjection(properties);
    accountCriteria.list();
    

    【讨论】:

    • criteria 来自哪里?那是在criteria.createCriteria("book","b");criteria 对象初始化的地方?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多