2013-10-03 38 views
0

我需要將LIKE運算符轉換爲JPA查詢。我需要將它用於String以外的其他類型,但JPA標準API允許我僅添加String參數。我嘗試使用.as(String.class),但某些內容失敗,並嘗試從底層的Oracle調用CAST函數,該函數對我來說再次失敗,原因不明。包含LIKE的JPQL查詢轉換爲條件

我試着在JPQL中編寫查詢,它按預期工作。這是查詢:

SELECT p from CustomerOrder p where p.id like '%62%' 

UPDATE:

查詢必須建立在一個通用的方式,因爲它是過濾,所以它需要在運行時創建。對已經創建的查詢我試圖添加LIKE條款是這樣的:

query.where(builder.like(selectAttributePath.as(String.class), "%"+filterValue.toString().toLowerCase()+"%")); 

但這種崩潰與此異常:

org.hibernate.hql.internal.ast.QuerySyntaxException: expecting CLOSE, found '(' near line 1, column 156 [select distinct generatedAlias0.id from de.brueckner.mms.proddetailschedact.data.CustomerOrder as generatedAlias0 where cast(generatedAlias0.id as varchar2(255 char)) like :param0] 

我執行相同的查詢直接甲骨文使用SQLDeveloper,所以從這個角度來看應該是合理的。所以問題在於Hibernate是個問題。有關如何修復它的任何建議?

如何使用JPA Criteria編寫此查詢?

回答

1

我通過從底層Oracle DB調用'TO_CHAR'功能以及使用該LIKE操作類似普通字符串的固定的問題。

query.where(builder.like(selectAttributePath.as(String.class), "%" +filterValue.toString().toLowerCase() + "%") 
0

您可以嘗試下面的代碼,它可能需要修改。

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<CustomerOrder> cq = cb.createQuery(CustomerOrder.class); 
Root<CustomerOrder> order = cq.from(CustomerOrder.class); 
cq.where(cb.like(Long.valueOf(order.get(CustomerOrder_.id)).toString(), "%62%")); 

TypedQuery<CustomerOrder> q = em.createQuery(cq); 
List<CustomerOrder> results = q.getResultList(); 
+0

已經這樣做了,代碼不編譯:找不到方法「像(表達式 X,表達模式)」。方法簽名是:'like(表達式 x,表達式模式)' –

+0

@ user503413您是否嘗試過明確地轉換它,如'Long.valueOf(id).toString()'。 –

+0

這可能會工作,但主題是一個更廣泛的主題的一部分,所以標準是以通用的方式構建的,因此我不會總是知道它是一個ID還是別的什麼 –