2009-10-19 74 views
1

注意:由於提供的註釋,我已更改提供的詳細信息。新的技術細節實際上是我試圖運行的代碼。使用帶複合鍵的Hibernate Criteria對象的問題

我有一個奇怪的問題目前與我的OneToMany/ManyToOne雙向關係之一。

在父表中,我有一個很長的標識符,除了構成其組合鍵的另一個字段外,子標題還包含該列。

在我查詢的示例數據中,在子表中有1條父記錄和3條相關記錄。目前,當我使用條件對象查詢表時,我得到3個父(CoPolicyPointer)記錄,其中2個沒有關聯的子(CoTransactionSummary)錶鏈接,然後是三個正確填充。我希望只能得到一個結果,這就是爲什麼我很困惑。你有什麼想法,爲什麼發生這種情況?

我在下面提供了更多的技術數據。

 
Parent Table (CoPolicyPointer) 
Column   Data Type 
SystemAssignId String    (Primary Key) 
PolicyPrefixCd String 
PolicyId   String 
PolicySeqNo  int 




Child Table (CoTransaction Summary) 
Column   Data Type 
SystemAssignId String     (composite key) 
TransSeqId  int      (composite key) 
TransType varchar(4) 

條件語句如下所示:

Criteria criteria = session.createCriteria(classToUse); 
criteria.createAlias("coTransactionSummaries", "ts"); 
criteria.add(Restrictions.ne("ts.transInProcessCd", "VIEW")); 
criteria.add(Restrictions.gt("ts.transSeqId", Short.valueOf("0"))); 
criteria.add(Restrictions.eq(BaseCoPolicyPointer.COL_POLICY_PREFIX_CD, 
      policyNumber.getPrefix().getLiteral())); 
criteria.add(Restrictions.eq(BaseCoPolicyPointer.COL_POLICY_ID, 
      policyNumber.getId())); 

父類的樣子:

@Entity(name = "CoPolicyPointer") 
public class CoPolicyPointerRedo { 
private static final String CLASS_NAME = CoPolicyPointerRedo.class 
     .getName(); 
private static final Logger logger = Logger.getLogger(CLASS_NAME); 

private String systemAssignId; 
private String policyPrefixCd; 
private String policyId; 
private String policyNumber; 
private Short policySeqNo; 
private Set coTransactionSummaries; 

@Id 
public String getSystemAssignId() { 
    return systemAssignId; 
} 

public void setSystemAssignId(String systemAssignId) { 
    this.systemAssignId = systemAssignId; 
} 

@Column 
public String getPolicyId() { 
    return policyId; 
} 

public void setPolicyId(String policyId) { 
    this.policyId = policyId; 
} 

@Column 
public String getPolicyPrefixCd() { 
    return policyPrefixCd; 
} 

public void setPolicyPrefixCd(String policyPrefixCd) { 
    this.policyPrefixCd = policyPrefixCd; 
} 

@Column 
public Short getPolicySeqNo() { 
    return policySeqNo; 
} 

public void setPolicySeqNo(Short policySeqNo) { 
    this.policySeqNo = policySeqNo; 
} 


@OneToMany(targetEntity = CoTransactionSummaryRedo.class, mappedBy = "coPolicyPointer") 
public Set getCoTransactionSummaries() { 
    return coTransactionSummaries; 
} 

public void setCoTransactionSummaries(Set coTransactionSummaries) { 
    this.coTransactionSummaries = coTransactionSummaries; 
} 

} 

孩子上課的樣子:

@Entity(name = "CoTransactionSummary") 
public class CoTransactionSummaryRedo { 
private static final String CLASS_NAME = CoTransactionSummaryRedo.class 
     .getName(); 
private static final Logger logger = Logger.getLogger(CLASS_NAME); 

private String transTypeCd; 
private String transInProcessCd; 
private CoPolicyPointerRedo coPolicyPointer; 

private CoTransactionSummaryIdRedo id; 

@EmbeddedId 
public CoTransactionSummaryIdRedo getId() { 
    return id; 
} 

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

@Column 
public String getTransInProcessCd() { 
    return transInProcessCd; 
} 

public void setTransInProcessCd(String transInProcessCd) { 
    this.transInProcessCd = transInProcessCd; 
} 

@Column 
public String getTransTypeCd() { 
    return transTypeCd; 
} 

public void setTransTypeCd(String transTypeCd) { 
    this.transTypeCd = transTypeCd; 
} 

@ManyToOne() 
@JoinColumn(name = "systemAssignId", insertable = false, updatable = false) 
public CoPolicyPointerRedo getCoPolicyPointer() { 
    return coPolicyPointer; 
} 

public void setCoPolicyPointer(CoPolicyPointerRedo coPolicyPointer) { 
    this.coPolicyPointer = coPolicyPointer; 
} 


} 

孩子類的ID類看起來像:

@Embeddable 
public class CoTransactionSummaryIdRedo implements java.io.Serializable { 

private String systemAssignId; 
private short transSeqId; 

public CoTransactionSummaryIdRedo() { 
} 

public CoTransactionSummaryIdRedo(String systemAssignId, short transSeqId) { 
    this.systemAssignId = systemAssignId; 
    this.transSeqId = transSeqId; 
} 

@Column 
public String getSystemAssignId() { 
    return systemAssignId; 
} 

public void setSystemAssignId(String systemAssignId) { 
    this.systemAssignId = systemAssignId; 
} 

@Column 
public short getTransSeqId() { 
    return transSeqId; 
} 

public void setTransSeqId(short transSeqId) { 
    this.transSeqId = transSeqId; 
} 

@Override 
public boolean equals(Object other) { 
    if ((this == other)) 
     return true; 
    if ((other == null)) 
     return false; 
    if (!(other instanceof CoTransactionSummaryIdRedo)) 
     return false; 
    CoTransactionSummaryIdRedo castOther = (CoTransactionSummaryIdRedo) other; 

    return ((this.getSystemAssignId() == castOther.getSystemAssignId()) || (this 
      .getSystemAssignId() != null 
      && castOther.getSystemAssignId() != null && this 
      .getSystemAssignId().equals(castOther.getSystemAssignId()))) 
      && (this.getTransSeqId() == castOther.getTransSeqId()); 
} 

@Override 
public int hashCode() { 
    int result = 17; 

    result = 37 
      * result 
      + (getSystemAssignId() == null ? 0 : this.getSystemAssignId() 
        .hashCode()); 
    result = 37 * result + this.getTransSeqId(); 
    return result; 
} 

} 

我已經記錄打開TRACE,這裏是什麼正在生成。

 
08:20:47,907 DEBUG SQL:111 - select this_.systemAssignId as systemAs1_1_2_, this_.policyId as policyId1_2_, this_.policyPrefixCd as policyPr3_1_2_, this_.policySeqNo as policySe4_1_2_, ts1_.systemAssignId as systemAs1_0_0_, ts1_.transSeqId as transSeqId0_0_, ts1_.transInProcessCd as transInP3_0_0_, ts1_.transTypeCd as transTyp4_0_0_, copolicypo4_.systemAssignId as systemAs1_1_1_, copolicypo4_.policyId as policyId1_1_, copolicypo4_.policyPrefixCd as policyPr3_1_1_, copolicypo4_.policySeqNo as policySe4_1_1_ from CoPolicyPointer this_ inner join CoTransactionSummary ts1_ on this_.systemAssignId=ts1_.systemAssignId left outer join CoPolicyPointer copolicypo4_ on ts1_.systemAssignId=copolicypo4_.systemAssignId where this_.policyPrefixCd=? and this_.policyId=? and this_.policySeqNo=? 
Hibernate: select this_.systemAssignId as systemAs1_1_2_, this_.policyId as policyId1_2_, this_.policyPrefixCd as policyPr3_1_2_, this_.policySeqNo as policySe4_1_2_, ts1_.systemAssignId as systemAs1_0_0_, ts1_.transSeqId as transSeqId0_0_, ts1_.transInProcessCd as transInP3_0_0_, ts1_.transTypeCd as transTyp4_0_0_, copolicypo4_.systemAssignId as systemAs1_1_1_, copolicypo4_.policyId as policyId1_1_, copolicypo4_.policyPrefixCd as policyPr3_1_1_, copolicypo4_.policySeqNo as policySe4_1_1_ from CoPolicyPointer this_ inner join CoTransactionSummary ts1_ on this_.systemAssignId=ts1_.systemAssignId left outer join CoPolicyPointer copolicypo4_ on ts1_.systemAssignId=copolicypo4_.systemAssignId where this_.policyPrefixCd=? and this_.policyId=? and this_.policySeqNo=? 
19:14:30,938 DEBUG AbstractBatcher:513 - preparing statement 
19:14:30,969 DEBUG StringType:151 - binding 'WA' to parameter: 1 
19:14:30,969 DEBUG StringType:151 - binding '0100036449' to parameter: 2 
19:14:30,969 DEBUG ShortType:151 - binding '0' to parameter: 3 
19:14:30,969 DEBUG AbstractBatcher:426 - about to open ResultSet (open ResultSets: 0, globally: 0) 
19:14:30,969 DEBUG Loader:717 - processing result set 
19:14:30,969 DEBUG Loader:722 - result set row: 0 
19:14:30,969 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_0_0_ 
19:14:30,969 DEBUG ShortType:193 - returning '0' as column: transSeqId0_0_ 
19:14:30,969 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_1_1_ 
19:14:30,969 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_1_2_ 
19:14:30,969 DEBUG Loader:1197 - result row: EntityKey[CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=0, systemAssignId=00502000000000}], EntityKey[CoPolicyPointerRedo#00502000000000], EntityKey[CoPolicyPointerRedo#00502000000000] 
19:14:30,969 DEBUG Loader:1379 - Initializing object from ResultSet: [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=0, systemAssignId=00502000000000}] 
19:14:30,969 DEBUG AbstractEntityPersister:2059 - Hydrating entity: [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=0, systemAssignId=00502000000000}] 
19:14:30,969 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_0_0_ 
19:14:30,969 DEBUG StringType:193 - returning 'PCNM' as column: transInP3_0_0_ 
19:14:30,969 DEBUG StringType:193 - returning 'PCNM' as column: transTyp4_0_0_ 
19:14:30,969 DEBUG Loader:1379 - Initializing object from ResultSet: [CoPolicyPointerRedo#00502000000000] 
19:14:30,969 DEBUG AbstractEntityPersister:2059 - Hydrating entity: [CoPolicyPointerRedo#00502000000000] 
19:14:30,985 DEBUG StringType:193 - returning '0100036449   ' as column: policyId1_1_ 
19:14:30,985 DEBUG StringType:193 - returning 'WA ' as column: policyPr3_1_1_ 
19:14:30,985 DEBUG ShortType:193 - returning '0' as column: policySe4_1_1_ 
19:14:30,985 DEBUG Loader:722 - result set row: 1 
19:14:30,985 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_0_0_ 
19:14:30,985 DEBUG ShortType:193 - returning '1' as column: transSeqId0_0_ 
19:14:30,985 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_1_1_ 
19:14:30,985 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_1_2_ 
19:14:30,985 DEBUG Loader:1197 - result row: EntityKey[CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=1, systemAssignId=00502000000000}], EntityKey[CoPolicyPointerRedo#00502000000000], EntityKey[CoPolicyPointerRedo#00502000000000] 
19:14:30,985 DEBUG Loader:1379 - Initializing object from ResultSet: [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=1, systemAssignId=00502000000000}] 
19:14:30,985 DEBUG AbstractEntityPersister:2059 - Hydrating entity: [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=1, systemAssignId=00502000000000}] 
19:14:30,985 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_0_0_ 
19:14:30,985 DEBUG StringType:193 - returning 'PCNM' as column: transInP3_0_0_ 
19:14:30,985 DEBUG StringType:193 - returning 'PCNM' as column: transTyp4_0_0_ 
19:14:30,985 DEBUG Loader:722 - result set row: 2 
19:14:30,985 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_0_0_ 
19:14:30,985 DEBUG ShortType:193 - returning '5' as column: transSeqId0_0_ 
19:14:30,985 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_1_1_ 
19:14:30,985 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_1_2_ 
19:14:30,985 DEBUG Loader:1197 - result row: EntityKey[CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=5, systemAssignId=00502000000000}], EntityKey[CoPolicyPointerRedo#00502000000000], EntityKey[CoPolicyPointerRedo#00502000000000] 
19:14:30,985 DEBUG Loader:1379 - Initializing object from ResultSet: [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=5, systemAssignId=00502000000000}] 
19:14:30,985 DEBUG AbstractEntityPersister:2059 - Hydrating entity: [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=5, systemAssignId=00502000000000}] 
19:14:30,985 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_0_0_ 
19:14:30,985 DEBUG StringType:193 - returning 'PCNM' as column: transInP3_0_0_ 
19:14:30,985 DEBUG StringType:193 - returning 'PCNM' as column: transTyp4_0_0_ 
19:14:30,985 DEBUG Loader:722 - result set row: 3 
19:14:30,985 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_0_0_ 
19:14:30,985 DEBUG ShortType:193 - returning '6' as column: transSeqId0_0_ 
19:14:30,985 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_1_1_ 
19:14:30,985 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_1_2_ 
19:14:30,985 DEBUG Loader:1197 - result row: EntityKey[CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=6, systemAssignId=00502000000000}], EntityKey[CoPolicyPointerRedo#00502000000000], EntityKey[CoPolicyPointerRedo#00502000000000] 
19:14:30,985 DEBUG Loader:1379 - Initializing object from ResultSet: [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=6, systemAssignId=00502000000000}] 
19:14:30,985 DEBUG AbstractEntityPersister:2059 - Hydrating entity: [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=6, systemAssignId=00502000000000}] 
19:14:30,985 DEBUG StringType:193 - returning '00502000000000' as column: systemAs1_0_0_ 
19:14:30,985 DEBUG StringType:193 - returning 'PCNM' as column: transInP3_0_0_ 
19:14:30,985 DEBUG StringType:193 - returning 'PCNM' as column: transTyp4_0_0_ 
19:14:30,985 DEBUG Loader:744 - done processing result set (4 rows) 
19:14:30,985 DEBUG AbstractBatcher:433 - about to close ResultSet (open ResultSets: 1, globally: 1) 
19:14:30,985 DEBUG AbstractBatcher:418 - about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 
19:14:30,985 DEBUG AbstractBatcher:562 - closing statement 
19:14:30,985 DEBUG ConnectionManager:427 - aggressively releasing JDBC connection 
19:14:30,985 DEBUG ConnectionManager:464 - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)] 
19:14:30,985 DEBUG DriverManagerConnectionProvider:152 - returning connection to pool, pool size: 1 
19:14:30,985 DEBUG Loader:874 - total objects hydrated: 5 
19:14:30,985 DEBUG TwoPhaseLoad:130 - resolving associations for [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=0, systemAssignId=00502000000000}] 
19:14:30,985 DEBUG DefaultLoadEventListener:199 - loading entity: [CoPolicyPointerRedo#00502000000000] 
19:14:30,985 DEBUG DefaultLoadEventListener:372 - attempting to resolve: [CoPolicyPointerRedo#00502000000000] 
19:14:30,985 DEBUG DefaultLoadEventListener:389 - resolved object in session cache: [CoPolicyPointerRedo#00502000000000] 
19:14:30,985 DEBUG TwoPhaseLoad:226 - done materializing entity [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=0, systemAssignId=00502000000000}] 
19:14:30,985 DEBUG TwoPhaseLoad:130 - resolving associations for [CoPolicyPointerRedo#00502000000000] 
19:14:30,985 DEBUG LoadContexts:218 - creating collection wrapper:[CoPolicyPointerRedo.coTransactionSummaries#00502000000000] 
19:14:31,047 DEBUG TwoPhaseLoad:226 - done materializing entity [CoPolicyPointerRedo#00502000000000] 
19:14:31,047 DEBUG TwoPhaseLoad:130 - resolving associations for [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=1, systemAssignId=00502000000000}] 
19:14:31,047 DEBUG DefaultLoadEventListener:199 - loading entity: [CoPolicyPointerRedo#00502000000000] 
19:14:31,047 DEBUG DefaultLoadEventListener:372 - attempting to resolve: [CoPolicyPointerRedo#00502000000000] 
19:14:31,047 DEBUG DefaultLoadEventListener:389 - resolved object in session cache: [CoPolicyPointerRedo#00502000000000] 
19:14:31,047 DEBUG TwoPhaseLoad:226 - done materializing entity [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=1, systemAssignId=00502000000000}] 
19:14:31,047 DEBUG TwoPhaseLoad:130 - resolving associations for [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=5, systemAssignId=00502000000000}] 
19:14:31,047 DEBUG DefaultLoadEventListener:199 - loading entity: [CoPolicyPointerRedo#00502000000000] 
19:14:31,047 DEBUG DefaultLoadEventListener:372 - attempting to resolve: [CoPolicyPointerRedo#00502000000000] 
19:14:31,047 DEBUG DefaultLoadEventListener:389 - resolved object in session cache: [CoPolicyPointerRedo#00502000000000] 
19:14:31,047 DEBUG TwoPhaseLoad:226 - done materializing entity [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=5, systemAssignId=00502000000000}] 
19:14:31,047 DEBUG TwoPhaseLoad:130 - resolving associations for [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=6, systemAssignId=00502000000000}] 
19:14:31,047 DEBUG DefaultLoadEventListener:199 - loading entity: [CoPolicyPointerRedo#00502000000000] 
19:14:31,047 DEBUG DefaultLoadEventListener:372 - attempting to resolve: [CoPolicyPointerRedo#00502000000000] 
19:14:31,047 DEBUG DefaultLoadEventListener:389 - resolved object in session cache: [CoPolicyPointerRedo#00502000000000] 
19:14:31,047 DEBUG TwoPhaseLoad:226 - done materializing entity [CoTransactionSummaryRedo#component[systemAssignId,transSeqId]{transSeqId=6, systemAssignId=00502000000000}] 
19:14:31,047 DEBUG StatefulPersistenceContext:860 - initializing non-lazy collections 
19:14:31,047 DEBUG JDBCContext:260 - after autocommit 
19:14:31,047 DEBUG ConnectionManager:427 - aggressively releasing JDBC connection 
19:14:31,047 DEBUG SessionImpl:449 - after transaction completion 
+0

您發佈的日誌中的唯一查詢與提供的條件不符。除此之外,從孩子到CoPolicyPointerRedo的ManyToOne使用systemAssignId(這是父母的PK)是相當奇怪的(爲什麼不是父母?)我還發現上面的查詢具有內部聯接子並且加入ManyToOne因爲默認情況下兩者都應該是懶惰的。你是否在壓倒某個地方? – ChssPly76 2009-10-20 02:20:30

+0

所以這個問題一直是火車殘骸......對此抱歉。我已經修改了標準數據和生成的sql,這是我現在所擁有的。 我對你的聲明感到困惑,聲明systemAssignId不在父級上,它被標記爲@ID字段。如果您引用@ManyToOne關係,則使用mappedBy屬性來指定如何完成映射。在迴應關於查詢的最後一個陳述時,您是正確的,因爲我強制在條件語句內發生連接。 – jwmajors81 2009-10-20 13:28:13

+0

不要忽視我的評論re:systemAssignId - 你的標準vs生成的SQL讓我失望。我已經更新了我的答案,請看看。 – ChssPly76 2009-10-21 02:41:07

回答

0

你張貼的映射和您提供的互相沖突的描述:

  1. 映射的逆相關連接列非插入/更新是行不通的。該專欄將如何更新(以及您的父母 - 子女關聯是否保持)?
  2. 您的子映射將Child's PK定義爲childId(使用@Id註釋)。這不是如何映射組合鍵的; Hibernate會認爲childId是一個簡單的主鍵。
  3. 您的條件與您的映射(ParentTable vs Parent等等)不匹配,這可能是一個轉換工件,但其他則看起來不錯。

我會使用別名,儘管:

Criteria criteria = session.createCriteria(Parent.class) 
.add(Restrictions.eq("policyNo", "1234")) 
.createAlias("child", "children") 
.add(Restrictions.ne("children.transType", "VIEW")); 

更新(基於標準/生成的SQL):

看看由Hibernate生成的SQL根據您的標準(爲可讀性而縮短):

SELECT this_.*, ts1_.*, copolicypo4_.* 
    FROM CoPolicyPointer this_ 
INNER JOIN CoTransactionSummary ts1_ ON this_.systemAssignId=ts1_.systemAssignId 
    LEFT JOIN CoPolicyPointer copolicypo4_ ON ts1_.systemAssignId=copolicypo4_.systemAssignId 

您會注意到您的「父」表(CoPolicyPointer)加入兩次即使您的條件只加入「子女」表。這是因爲你在@Entity註釋指定實體的名稱,但創建一個使用類名的標準,使休眠覺得你連接三個獨立的實體:

  1. 標準基於CoPolicyPointerRedo.class
  2. 它加入到CoTransactionSummaryRedo.class其實體名稱爲CoTransactionSummary
  3. 它連接回CoPolicyPointerRedo.class爲``CoPolicyPointer using @ ManyToOne`

您需要與命名保持一致。可以從@Entity聲明中刪除name聲明(您可以使用@Table代替指定表名稱),也可以使用session.createCriteria(String entityName)方法創建條件,該方法將實體名稱而不是類名稱作爲參數。

+0

我已經按照建議從註釋中移除了insertable = false和updatable = false。 關於你的第二點,你是正確的@ID註釋是不正確的,我的代碼實際上有@EmbeddedId。我不得不建立一個獨立的例子,因爲我不應該在互聯網上分享公司代碼,也沒有意識到我使用了錯誤的註釋。對困惑感到抱歉。 我將條件代碼更改爲上面的代碼,並且仍然返回3個父對象,而不是僅附加了子記錄的1個對象。 有沒有其他想法? – jwmajors81 2009-10-19 21:14:15

+0

我同情「不共享代碼」,但我不認爲只發布相關片段(以及像您一樣更改實體名稱)會令人反感 - 否則很難在沒有看到確切問題的情況下提出解決方案。 @EmbeddedId你提到應該(是)應用於另一個(組件)類。如何分配該組合ID的cihld的一部分?你在Hibernate中啓用了SQL輸出嗎?如果是這樣,生成什麼查詢?根據你的數據看起來是否合理,或者你看到明顯的錯誤? – ChssPly76 2009-10-19 21:21:22

+0

我試過你的建議,但我仍然得到一個額外的左外連接到SQL的末尾。通過將以下內容添加到標準聲明中,我可以得到明顯的結果: 條件\t \t \t \t .setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); 但是,這並不是想法,因爲所有記錄都從數據庫中返回,並且hibernate必須確定要使用哪條記錄,所以我仍然希望找到另一個選項。 – jwmajors81 2009-10-22 23:18:08