2011-04-18 72 views
3

我正在從Hibernate Criteria API升級到JPA2 Criteria API,並且正在運行以下問題,這似乎無法解決。使用JPA2 Criteria API查詢字符串子集

在Hibernate的標準我用Restrictions.sqlRestriction檢查特定類型的串子的:

criteria.add(Restrictions.sqlRestriction("{alias}.location_key = left((?), length({alias}.location_key))", searchObj.getLocationKey(), Hibernate.STRING)); 

這實質上會檢查輸入字符串的第一個字母N匹配location_key這是N字母長。即輸入字符串Canada,ON應與以下任何內容匹配:CanadaCanC

問題是JPA2不允許我們這樣編碼原生sql,而且我不知道如何在沒有left函數(我認爲可能是mysql特定的)下實現類似的功能。

任何幫助表示讚賞!

回答

1

我不確定你的查詢究竟是如何工作的,但是你不應該使用CriteriaBuilder.substring(Expression,int)而不是LEFT()?如果您提供您希望生成的實際SQL,我可能會有更好的想法。

+0

我確實包括了我想要生成的sql。 'select ... where location_key = left((「asdfasdf」),length(location_key));'是更準確的查詢版本。子串對我沒有多大好處,因爲它期望表達式,而不是字符串。 – idbentley 2011-04-27 17:44:28

+0

'CriteriaBuilder.literal(T)'創建一個'Expression '。基本上:'criteriaQuery.where(cb.equals(cb.substring(cb.literal(string),0,location_key.length()),location_key));'應該這樣做。 – 2011-04-28 06:39:46

+0

非常感謝 - 我實際上昨天通過參數得到了這個工作,但我認爲文字很聰明。 – idbentley 2011-04-28 21:26:30