【问题标题】:Retrieve data where corresponding mapping is not found in one-to-many mapped field检索在一对多映射字段中找不到对应映射的数据
【发布时间】:2014-11-18 10:34:01
【问题描述】:

我目前正在我的工作中试用 Hibernate Criteria。

假设我有以下实体。

@Entity
@Table(name="form_table_name")
public class Forms extends Auditable 
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="FormID")
    private Long formID;

    @Column(name="FormTitle")
    private String formTitle;

    @OneToMany(mappedBy = "form", fetch = FetchType.EAGER , cascade = {CascadeType.ALL} , orphanRemoval = true)
    private Set<FormsResponses> responses;
    ..........//rest of the code with fields, getters, setters etc.

@Entity
@Table(name="response_table_name")
public class FormsResponses extends Auditable 
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="ResponseID")
    private Long responseID;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="FormID")
    private Forms form;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="OnBehalfOf")
    private Users onBehalfOf;
    ..........//rest of the code

考虑我有以下数据 form_table_name

FormID FormTitle
------ --------- 
1      Form1
2      Form2

response_table_name

ResponseID FormID OnBehalfOf
---------- ------ ----------
1          1         user1
2          1         user2
4          2         user2

我想从 Forms 实体加载数据,当且仅当 FormsResponses 中没有与我为“onBehalfOf”字段传递的值相对应的记录并且'formID'。

比如说,我当前的“onBehalf”值是“user1”。我想检索 form1 和 form2。但是,如果表单的 formsResponse 映射行中有“user1”,则不应显示表单。或者,如果用户已经尝试过表单,则不应检索它。在这种情况下,该表单将为“Form2”,而“user2”则为“空”

Criteria cr = session.createCriteria(Forms.class);
cr.createCriteria("responses", "res", CriteriaSpecification.LEFT_JOIN)
            .add(Restrictions.eq("res.onBehalfOf.userID", userID));
            cr.add(Restrictions.sizeEq("responses", 0));

我试过这个,但它不符合我的目的。我希望有人能指出我正确的方向。

【问题讨论】:

    标签: spring hibernate hql criteria


    【解决方案1】:

    您的查询应该是这样的:

    Criteria c = session.createCriteria(Forms.class, "frm");
    c.createAlias("frm.responses", "res", CriteriaSpecification.LEFT_JOIN);
    c.createAlias("res.onBehalfOf", "beh", CriteriaSpecification.LEFT_JOIN, Restrictions.eq("beh.userID", userID));
    c.add(Restrictions.isNull("beh.userID"));
    return c.list();
    

    【讨论】:

    • 当然。将检查和更新。 “beh.id”是指“beh.userID”,对吧?
    • 很高兴能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多