java - 连接表上的 Hibernate 标准显示意外结果

标签 java hibernate join criteria

我有一个如下所示的标准:

public List<role> searchByFormStatus(boolean status) {
    Criteria criteria = this.getSession().createCriteria(this.getPersistentClass());
    List<role> result = (List<role>) criteria                               
                        .setFetchMode("role", FetchMode.JOIN)
                        .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
                        .createAlias("formApprovals", "f")
                        .add(Restrictions. eq("f.latestApproval", true))
                        .list();
    return result;                          
}

乍一看它应该可以工作,但无论我在参数中发送 true 或 false 值,结果总是如此

[{
    "roleIsActive": true,
    "roleName": "role1",
    "roleNotes": "note",
    "formApprovals": [
        {
            "approvalNotes": "good",
            "approvedDate": 1449900000000,
            "fkapprovedBy": 1,
            "idformApproval": 1,
            "latestApproval": true
        },
        {
            "approvalNotes": "bad",
            "approvedDate": 1449900000000,
            "fkapprovedBy": 1,
            "idformApproval": 2,
            "latestApproval": false
        }
}]

如您所见,“formApprovals”会带来数据库中的所有寄存器,即使我为latestApproval 属性创建限制

父对象(角色)中的属性声明为:

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="role")
public Set<FormApproval> getFormApprovals() {
    return this.formApprovals;
}

public void setFormApprovals(Set<FormApproval> formApprovals) {
    this.formApprovals = formApprovals;
}

检查控制台,我可以看到 hibernate 正确生成了 where 子句,但是,我可以看到之后还有其他查询,这些查询是否可能(我不知道它们为什么在那里)是否会覆盖我的标准?

有什么想法吗?

编辑

FormApproval类

@Entity
@Table(name="FormApproval"
    ,catalog="catalog"
)
public class FormApproval  implements java.io.Serializable {

    private static final long serialVersionUID = 8L;
     private int idformApproval;
     private role role;
     private Integer fkapprovedBy;
     private Date approvedDate;
     private String approvalNotes;
     private boolean latestApproval;

    public FormApproval() {
    }


    public FormApproval(int idformApproval, role role) {
        this.idformApproval = idformApproval;
        this.role = role;
    }
    public FormApproval(int idformApproval, role role, Integer fkapprovedBy, Date approvedDate, String approvalNotes, boolean latestApproval) {
       this.idformApproval = idformApproval;
       this.role = role;
       this.fkapprovedBy = fkapprovedBy;
       this.approvedDate = approvedDate;
       this.approvalNotes = approvalNotes;
       this.latestApproval = latestApproval; 
    }

     @Id @GeneratedValue(strategy = IDENTITY) 

    @Column(name="IDFormApproval", unique=true, nullable=false)
    public int getIdformApproval() {
        return this.idformApproval;
    }

    public void setIdformApproval(int idformApproval) {
        this.idformApproval = idformApproval;
    }

@JsonIgnore
@ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="FKRole", nullable=false)
    public role getrole() {
        return this.role;
    }

    public void setrole(role role) {
        this.role = role;
    }


    @Column(name="LatestApproval")
    public boolean getLatestApproval() {
        return this.latestApproval;
    }

    public void setLatestApproval(boolean latestApproval) {
        this.latestApproval = latestApproval;
    }

    @Column(name="FKApprovedBy")
    public Integer getFkapprovedBy() {
        return this.fkapprovedBy;
    }

    public void setFkapprovedBy(Integer fkapprovedBy) {
        this.fkapprovedBy = fkapprovedBy;
    }
    @Temporal(TemporalType.DATE)
    @Column(name="ApprovedDate", length=10)
    public Date getApprovedDate() {
        return this.approvedDate;
    }

    public void setApprovedDate(Date approvedDate) {
        this.approvedDate = approvedDate;
    }

    @Column(name="ApprovalNotes")
    public String getApprovalNotes() {
        return this.approvalNotes;
    }

    public void setApprovalNotes(String approvalNotes) {
        this.approvalNotes = approvalNotes;
    }
}

角色类别

@Entity
@Table(name="Role"
    ,catalog="catalog"
)    
public class Role  implements java.io.Serializable {

    private static final long serialVersionUID = 1L;
    private int idRole;
     private WorkType workType;
     private String roleName;
     private String roleNotes;
     private boolean roleIsActive;
     private Set<FormApproval> formApprovals = new HashSet<FormApproval>(0);
     private Set<Topicrole> topicRoles = new HashSet<TopicRole>(0);
     private Set<FormFeedBack> formFeedBacks = new HashSet<FormFeedBack>(0);
     private Set<UserRole> userRoles = new HashSet<UserRrole>(0);
     private Set<Interview> interviews = new HashSet<Interview>(0);

    public Role() {
    }


    public Role(int idRole, WorkType workType, String roleName, boolean roleIsActive) {
        this.idRole = idRole;
        this.workType = workType;
        this.RoleName = RoleName;
        this.roleIsActive = roleIsActive;
    }
    public Role(int idRole, WorkType workType, String roleName, String roleNotes, boolean roleIsActive, Set<FormApproval> formApprovals, Set<TopicRole> topicRoles, Set<FormFeedBack> formFeedBacks, Set<UserRole> userRoles, Set<Interview> interviews) {
       this.idRole = idRole;
       this.workType = workType;
       this.RoleName = RoleName;
       this.roleNotes = roleNotes;
       this.roleIsActive = roleIsActive;
       this.formApprovals = formApprovals;
       this.topicRoles = topicRoles;
       this.formFeedBacks = formFeedBacks;
       this.userRoles = userRoles;
       this.interviews = interviews;
    }

     @Id @GeneratedValue(strategy = IDENTITY) 

    @Column(name="IDRole", unique=true, nullable=false)
    public int getIdrole() {
        return this.idRole;
    }

    public void setIdrole(int idRole) {
        this.idRole = idRole;
    }
@ManyToOne(fetch=FetchType.EAGER)
    @JoinColumn(name="FKWorkType", nullable=false)
    public WorkType getWorkType() {
        return this.workType;
    }

    public void setWorkType(WorkType workType) {
        this.workType = workType;
    }

    @Column(name="RoleName", nullable=false)
    public String getRoleName() {
        return this.roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    @Column(name="RoleNotes")
    public String getRoleNotes() {
        return this.roleNotes;
    }

    public void setRoleNotes(String roleNotes) {
        this.roleNotes = roleNotes;
    }

    @Column(name="RoleIsActive", nullable=false)
    public boolean isRoleIsActive() {
        return this.roleIsActive;
    }

    public void setRoleIsActive(boolean roleIsActive) {
        this.roleIsActive = roleIsActive;
    }

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="role")
    public Set<FormApproval> getFormApprovals() {
        return this.formApprovals;
    }

    public void setFormApprovals(Set<FormApproval> formApprovals) {
        this.formApprovals = formApprovals;
    }

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="role")
    public Set<TopicRole> getTopicRoles() {
        return this.topicRoles;
    }

    public void setTopicRoles(Set<TopicRole> topicRoles) {
        this.topicRoles = topicRoles;
    }

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="role")
@JsonManagedReference
    public Set<FormFeedBack> getFormFeedBacks() {
        return this.formFeedBacks;
    }

    public void setFormFeedBacks(Set<FormFeedBack> formFeedBacks) {
        this.formFeedBacks = formFeedBacks;
    }

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="role")
    public Set<UserRole> getUserRoles() {
        return this.userRoles;
    }

    public void setUserRoles(Set<UserRole> userRoles) {
        this.userRoles = userRoles;
    }

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="acnrole")
    public Set<Interview> getInterviews() {
        return this.interviews;
    }

    public void setInterviews(Set<Interview> interviews) {
        this.interviews = interviews;
    }

}

最佳答案

您可以尝试使用该限制作为 ON 的一部分关联顶部的条款。

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="role")
@Where(clause=" latestApproval='true' ")
public Set<FormApproval> getFormApprovals() {
    return this.formApprovals;
}

您也可以消除设置 FetchMode.JOIN使用方法 org.hibernate.Criteria.createAlias(String associationPath, String alias, JoinType joinType) 指向关联路径来获取

public List<role> searchByFormStatus(boolean status) {
    Criteria criteria = this.getSession().createCriteria(Role.class, "role")
            .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)
            .createAlias("role.formApprovals", "formApprovals", JoinType.LEFT_OUTER_JOIN);
    return criteria.list();
}

更新:

对于旧版本的 hibernate,请使用下面的其他方法。哪里joinType LEFT_OUTER_JOIN 的值将为 1 join 子句可以作为第四个参数传递。

public Criteria createAlias(String associationPath, String alias, int joinType, Criterion withClause) throws HibernateException;

关于java - 连接表上的 Hibernate 标准显示意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34440985/

相关文章:

java - 如何更改 JAX-WS 中的响应 xml

java - 是否有任何 Maven 插件允许生成一个接口(interface)实现的文件列表?

java - hql查询外连接

mysql - 基于公共(public)数据字段连接两个查询的结果

mysql - 连接mysql上的多个复杂表

c# - 类在系统中有哪些类型的关联?如何在 UML 中最好地表示它们?

java - 如何检查输入值是整数还是 float ?

java - 使用 Maven 进行 Vaadin 项目

java - 将 Hibernate 中的日期存储为 UTC 时间日期?

mySQL - 基于其他内连接的内连接