【问题标题】:Hibernate criteria join休眠条件加入
【发布时间】:2014-09-04 07:00:55
【问题描述】:

我有两个班级,例如:

@Entity
public class Customer{
    @Id
    private String id;
    private String name;
    @Column(nullable=false, unique=true)
    private String refId;
}


@Entity
public class Account{
    @Id
    private String id;
    @Column(nullable=false, unique=true)
    private String accountNr;
    @Column(nullable=false)
    private String accountType;
    @Column(nullable=false, unique=true)
    private String refId;
}

我想在 refId 上加入这两个类,以便在 Account 字段上进行排序,例如:

select c.* from Customer as c inner join Account as a on a.refId=c.refId orderBy a.accountType

有没有办法在条件中进行这样的查询

【问题讨论】:

    标签: java hibernate criteria


    【解决方案1】:

    您应该使用表之间的关系,例如@OneToOne, @ManyToOne.
    之后写HQL就很容易了。
    你可以阅读更多关于它的信息here

    【讨论】:

    • 但在我的情况下,类并不相互引用,它是 oneToOne 关系,但不在主键上
    【解决方案2】:

    Hibernate 通常不允许您像在 SQL 查询中那样通过 Criteria 进行“按需”连接。 However, this appears to indeed be possible using a work-around of having multiple Criterias.

    但是,如果您按照 Alex 的建议在您的 Entity 类中映射关联,您可以像这样创建一个更简单的 Criteria,因为 Customer 将有一个 account 对象已经“映射”到它:

    Criteria criteria = session.createCriteria(Customer.class)
            .createCriteria("account")
            .addOrder(Order.asc("accountType"));
    

    要进行关联,您可以在 Entity 类中将 refId 字段替换为相关对象。所以,在Customer 类中,你可以有一个Account 对象关联,就像这样(反之亦然):

    @Entity
    public class Customer {
        // Instead of "refId" field:
        @OneToOne(mappedBy = "customer")
        private Account account;
    }
    
    @Entity
    public class Account {
        // Instead of "refId" field:
        @OneToOne
        @JoinColumn(name = "refIdColName")
        private Customer customer;
    }
    

    假设这是一对一的关系。 You don't need to reference the primary key in one-to-one mapping.

    【讨论】:

    • 给定的链接(DetachedCriteria)按预期工作, refId 是所需的,我别无选择,只能这样做。无论如何,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2013-11-03
    • 2016-03-15
    • 1970-01-01
    相关资源
    最近更新 更多