Hibernate: установить условие для нескольких уровней потомков - PullRequest
1 голос
/ 07 января 2020

У меня есть вопрос о спящем запросе. Я использую hiberate 5.3.10.

Прежде всего, у меня есть домен Parent. java, ParentAlert. java и ParentAlertDetail. java как следует:

Parent:

public class Parent {
private String parentId;
private List<ParentAlert> parentAlerts;

@Id 
@Column(name = "Parent_id", length = 12)
public String getParentId() {
    return parentId;
}

public void setParentId(String parentId) {
    this.parentId = parentId;
}

@OneToMany(
        targetEntity = ParentAlert.class, 
        mappedBy = "parentAlert", 
        fetch = FetchType.LAZY)
public List<ParentAlert> getParentAlerts() {
    return parentAlerts;
}

public void setParentAlerts(List<ParentAlert> parentAlerts) {
    this.parentAlerts = parentAlerts;
}}

ParentAlert:

public class ParentAlert {

private String parentAlertID;
private Parent parent;
private Collection<ParentAlertDetail> parentAlertDetails;
private String status;

@Id
@Column(name = "Parent_Alert_ID", length = 12)
@NotEmpty
public String getParentAlertID() {
    return parentAlertID;
}

public void setParentAlertID(String parentAlertID) {
    this.parentAlertID = parentAlertID;
}

@OneToOne(targetEntity = Parent.class, fetch = FetchType.LAZY)
@JoinColumn(name = "Parent_id")
public Parent getParent() {
    return parent;
}

public void setParent(Parent parent) {
    this.parent = parent;
}

@OneToMany(targetEntity = ParentAlertDetail.class, mappedBy = "id.parentAlert", fetch = FetchType.LAZY, cascade = {
        CascadeType.ALL })
public Collection<ParentAlertDetail> getParentAlertDetails() {
    return parentAlertDetails;
}

public void setParentAlertDetails(Collection<ParentAlertDetail> parentAlertDetails) {
    this.parentAlertDetails = parentAlertDetails;
}

@Column(name = "status", nullable = false, length = 1)
public String getStatus() {
    return this.status;
}

public void setStatus(String status) {
    this.status = status;
}}

ParentAlertDetail

public class ParentAlertDetail{

private ParentAlertDetailID id;
private String desc;
private String status;

@EmbeddedId
@AttributeOverrides(value = { @AttributeOverride(name = "parentAlert", column = @Column(name = "Parent_Alert_Id")),
        @AttributeOverride(name = "parentAlertDetailId", column = @Column(name = "Parent_Alert_Detail_id")) })
public ParentAlertDetailID getId() {
    return id;
}

public void setId(ParentAlertDetailID id) {
    this.id = id;
}

@Column(name = "desc", length = 100)
public String getDesc() {
    return this.desc;
}

public void setDesc(String desc) {
    this.desc = desc;
}

@Column(name = "Status", length = 1)
public String getStatus() {
    return status;
}

public void setStatus(String status) {
    this.status = status;
}}

ParentAlertDetailID

public class ParentAlertDetailID{                                                                                                  

private Integer parentAlertDetailId;                                                                                                                          
private ParentAlert parentAlert;                                                                                                                           

@Column(name = "Parent_Alert_Detail_id")                                                                                                                       
@NotEmpty                                                                                                                                                      
public Integer getParentAlertDetailId() {                                                                                                                     
    return parentAlertDetailId;                                                                                                                               
}                                                                                                                                                              

public void setParentAlertDetailId(Integer parentAlertDetailId) {                                                                                            
    this.parentAlertDetailId = parentAlertDetailId;                                                                                                          
}                                                                                                                                                              

@ManyToOne(targetEntity = ParentAlert.class, fetch = FetchType.LAZY)                                                                                        
@JoinColumn(name = "Parent_Alert_ID", nullable = true)                                                                                                         
public ParentAlert getParentAlert() {                                                                                                                      
    return parentAlert;                                                                                                                                       
}                                                                                                                                                              

public void setParentAlert(ParentAlert parentAlert) {                                                                                                     
    this.parentAlert = parentAlert;                                                                                                                          
}                                                                                                                                                           }  

Я хочу отфильтровать parentAlert.status = ' A 'and parentAlertDetail.status =' A '.

Запрос

    String sql = "SELECT distinct parent FROM Parent parent" 
                     + " LEFT OUTER JOIN fetch parent.parentAlerts patientAlert"
                     + " LEFT OUTER JOIN patientAlert.patientAlertDetails patientAlertDetail"
                     + " WHERE (patientAlert.status ='A' or patientAlert.status is null) "
                     + " and (patientAlertDetail.status ='A' or patientAlertDetail.status is null)";

        Query query = getCurrentSession().createQuery(sql);
                 List<Parent> resultList = query.getResultList();                                                                                                                                           

Однако я обнаружил, что записи в PatientAlertDetail не могут быть отфильтрованы (это означает, что PatientAlertDetail.status =' I 'также выбраны записи)

Могу ли я спросить что-то неправильное в моем запросе или домене?

Кроме того, возможно ли получить все таблицы в родительском домене, не используя выборку в запросе? Это потому, что у меня есть несколько дочерних доменов в Parent (например, ParentContact et c)

Спасибо.

...