2015-12-23 31 views
2

我有一個標準的,看起來像這樣:Hibernate的標準顯示意想不到的效果

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; 
} 

檢查控制檯,我可以看到,在正在生成條款恰當地休眠,但是,我可以看到,後面還有其他疑問,有可能這些查詢(我不知道他們爲什麼在那裏)會覆蓋我的標準嗎?

任何想法?

EDIT

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; 
    } 

}

+1

你能與註釋的問題添加FormApproval場左外連接?爲什麼你需要設置獲取模式和結果轉換器? –

+0

@JohnScattergood完成! fetchmode和resulttransformer在那裏,因爲我在使用Inner Join生成的查詢時遇到問題,但我需要左外連接,並且解決了問題 – rhernandez

+0

您需要左外連接,因爲role.formApprovals可能爲null?您是否嘗試將獲取模式添加爲createAlias()的一部分? –

回答

1

使用固定

.createCriteria("formApprovals","f",1,Restrictions.eq("f.latestApproval", status)) 

1強制查詢

0

隨着預先抓取類型,嵌套標準應爲這種情況下的工作:

public List<role> searchByFormStatus(boolean status) { 
    Criteria criteria = this.getSession().createCriteria(this.getPersistentClass()); 
    List<role> result = (List<role>) criteria        
         .createCriteria("formApprovals") 
          .add(Restrictions.eq("latestApproval", true)) 
         .list(); 
    return result;       
} 
+0

它一直檢索所有formApprovals數據 – rhernandez

+0

即使是帶有latestApproval!= true的 –

+0

yes,就像條件正在被覆蓋某處 – rhernandez

1

您可以嘗試在關聯頂部使用限制作爲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,並且連接子句可以作爲第四個參數傳遞。

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

當我將JoinType.LEFT_OUTER_JOIN添加到createAlias,我得到一個參數無效的錯誤,好像JoinType發送一個整數。 @Where(clause =「latestApproval ='true'」) 是否有動態值? – rhernandez

+0

它應該只用'JoinType'作爲參數,你看到的例外是什麼? –

+0

類型Criteria中的方法createAlias(String,String,int)不適用於參數(String,String,JoinType) – rhernandez

相關問題