2017-02-14 103 views
1

我想創建一個查詢使用CriteriaBuilder,我需要有一個謂詞,其中謂詞的值是像數據庫中的值。JPA CriteriaBuilder值像列

基本上,我需要能夠做到以下幾點: WHERE myTestValue LIKE columnValue

在本機查詢,這是應該做的是一個選項,但使用CriteriaBuilder或NamedQueries,它似乎並沒有工作。

String myValue = "[email protected]"; 
cb.where(cb.like(myValue, root.get(Entity_.email)); 

在JPA中是否有這樣的選項?或者我應該回到原生查詢?

編輯 我需要能夠檢查,如果給定值匹配數據庫中的通配符項。所以數據庫有記錄%@bar.com%,我需要檢查我的給定值[email protected]是否與該記錄匹配。

+0

也許你忘了在測試字符串的開始和結尾處添加「%」? – perissf

+0

你有什麼錯誤嗎?或者它只是不工作.. –

+0

它只是不編譯。 JPA不喜歡這樣做;) – Erates

回答

1

我覺得你應該PARAMS是圓的另一種方式:

cb.where(cb.like(root.get(Entity_.email),myValue); 

的方法,另外,你可能需要使用這個添加到第二個PARAM:

cb.where(cb.like(root.get(Entity_.email),"%"+myValue+"%"); 
+0

我需要它們是這樣的順序我需要檢查給定的電子郵件地址是否匹配數據庫中的通配符條目 – Erates

+0

找到類似的問題可能會這幫助。 http://stackoverflow.com/q/30718445/3136973 – Navnath

+0

這只是一個示例如何實現'WHERE columnValue LIKE myTestValue',我需要它反之亦然'WHERE myTestValue LIKE columnValue' – Erates

1

克里斯找到了答案。首先,我需要「生成」一個參數。

ParameterExpression<String> senderEmailParameter = cb.parameter(String.class, "senderEmailParameter"); 
Path<String> senderEmailPath = root.get(Entity_.senderEmail); 

Predicate predEmail = cb.like(senderEmailParameter, senderEmailPath); 

然後我需要填寫查詢中的參數。

q.where(predEmail); 

return em.createQuery(q).setParameter("senderEmailParameter", senderEmail).getSingleResult(); 

This Works!謝謝克里斯!

相關問題