2015-02-06 18 views
0

我在嘗試解決這個問題時遇到了一些麻煩,但在Java和Google上都遇到了這個問題。使用JPA的休眠組合鍵加入

我有兩張表我想加入。它們都具有複合主鍵,並且子表在父級PK中具有相同的列,另外還有兩個額外的列。在Java中,類看起來大致(忽略getter/setter方法等),就像這樣:

@Embeddable 
public class ParentKey { 
    private Date someDate; 
    private String someKeyField; 
} 

@Embeddable 
public class ChildKey { 
    private Date someDate; 
    private String someKeyField; 
    private String anotherKeyField; 
} 

我試圖查詢基於一個java.util.DateString家長。理想情況下,他們熱切地拿到Set<Child>加入someDatesomeKeyField

我已經知道它能夠爲父母提取數據了,但是在獲取子女時它會彈出ORA-01858: a non-numeric character was found where a numeric was expected。我認爲它有東西java.util.Date字段有關,但我不確定是什麼。

兩個實體類是這個樣子:

@Entity 
public class Parent { 

    @EmbeddedId 
    private ParentKey key; 

    @OneToMany(fetch = EAGER, mappedBy = "parent") 
    private Set<Child> children; 

    private String someData; 
    // more data 
} 

@Entity 
public class Child { 

    @EmbeddedId 
    private ChildKey key; 

    @ManyToOne 
    @JoinColumn({ 
     @JoinColumn(name = "SOME_DATE", insertable = false, updatable = false), 
     @JoinColumn(name = "SOME_KEY_FIELD", insertable = false, updatable = false), 
    }) 
    private Parent parent; 

    private String someChildData; 
    // more data 
} 

兩個父和子表有「SOME_DATE」(日期型)和「SOME_KEY_FIELD」(vachar2型)在其中列。當我打印查詢時,我可以看到Hibernate嘗試第二個查詢,因此它找到了一些父母並正在嘗試尋找孩子。

我上面可能做了一些錯誤的事情,但我無法想象我會做什麼會導致ORA-01858。即使我刪除了所有附加字段,並將其完全粘貼到關鍵字段,但我也遇到了同樣的錯誤,所以我覺得Hibernate正在做一些意想不到的事情,我只是不知道該怎麼做。

有沒有更好的方式來做這樣的加入或組織我的@EmbeddedIds?我在做什麼有什麼明顯的錯誤?

編輯:我已經打印出兒童查詢的綁定變量,它的綁定順序錯誤。我認爲,如果有一種方法可以指定父代的字段以及它們綁定的列,這將會被解決。

+0

如果您設置了調試日誌記錄,那麼您是否收到有關該消息的更多信息? – 2015-02-06 20:42:19

回答

0

看過顯示綁定變量的Hibernate調試後,很明顯它沒有綁定子查詢(即Hibernate生成的)中的正確參數。這似乎有點隨意。

referencedColumnNames添加到@JoinColumn註解修復它,但。