2010-09-17 84 views
0

我有一個查詢,看起來像這樣休眠返回另一個對象

Document document = DocDAO.getSession().read(someId); 
MyFile file = (MyFile) DAO.getSession() 
.createQuery("SELECT file FROM MyFile file WHERE file.document = :document AND file.version = :version") 
.setParameter("document", document) 
.setParameter("version", version) 
.uniqueResult(); 

現在,我應該得到一個文件,其中file.getDocument()的getId()== someId和someId是一個BigInteger。但不幸的是,它們並不平等。什麼樣的錯誤可能導致被查詢的實體不是我正在尋找的實體?

乾杯

的Nik

+0

什麼數據庫數據類型是ID? – 2010-09-17 17:45:09

+0

id是一個mysql bigint(20) – niklassaers 2010-09-17 18:11:48

+0

這應該工作。什麼SQL被執行?看到[這個問題](http://stackoverflow.com/questions/2536829/hibernate-show-real-sql)來激活SQL日誌記錄。 – 2010-09-17 21:48:01

回答

1

BigInteger的是一個對象,而不是原始的。您可能需要執行bigInt1.equals(bigInt2)而不是bigInt1 == bigInt2。編輯:
也許我錯了。 Javadoc中說:

的BigInteger提供類似物所有Java的基本整數運營商的

再次編輯: 如果要廢除的BigInteger,嘗試宣告你的JPA實體屬性作爲Long(或long如果它不可爲空),然後使用@Column註釋來定義在必要時實際的數據庫列結構。下面是這個註釋的例子:

@Column(updatable = false, name = "MY_DB_COLUMN", nullable = false, length=12) 
private long myEntityAttribute; 

我不記得確切如何使用length屬性時,該列數字。最大位數?您可以查看@Column的詳細信息並進行實驗,直到您找到正確的答案。

+0

我還沒有使用過BigInteger,但我很肯定你第一次是對的。 「提供類似物」與「覆蓋== ==運算符」不同 - 它不能在Java中完成。 – 2010-09-17 19:45:00

+0

那麼,我應該使用什麼而不是MySQL或BigInteger中的bigint?我喜歡使用Long,但我不知道在MySQL中映射到的內容,並且我的ID對於整數來說太長 – niklassaers 2010-09-17 19:55:10

+0

您可以覆蓋從數據庫類型到Java實體類型的默認映射。我從Eclipse的當前項目生成JPA實體,我認爲BigInteger是非十進制數字列的默認值。我只是將它們改爲long(或Long)而不修改數據庫模式。如果數據庫列的值超過了Long.MAX_VALUE,那麼您將只會遇到問題,該值很大。 – 2010-09-17 21:39:21