2010-08-04 48 views
2

這看起來非常簡單,我不相信我自己還沒有找到解決方案。我有一個名爲PersonBean的bean,它有一個名字。現在我想編寫一個查找方法,它接受一個字符串並以大小寫不敏感的方式查找名稱中帶有該字符串的人。這是我目前的EJB QL:在EJB中區分大小寫的搜索QL

SELECT OBJECT(p) 
FROM Person p 
WHERE (p.name LIKE ?1) 

我有2個問題是:

  1. 我希望搜索不區分大小寫(上面是區分大小寫),我無法找到例如EJB QL中的lower()upper()。我該怎麼做才能做到這一點? 更新:我正在使用J2EE版本1.4和glassfish版本2.1,如果這很重要。
  2. 我必須將一個醜陋的字符串傳遞給該方法,即findByString("%john%")。有沒有辦法編寫EJB QL,以便我可以傳遞類似findByString("john")的東西?
+0

沒有任何關於JPA在這個問題(JPA已經在Java EE 5的引入和EJB 3.0)。所以請不要使用JPA標記它。 – 2010-08-05 06:53:33

+0

我沒有,也許有人編輯添加它。 – phunehehe 2010-08-05 07:08:54

回答

1

關於你提到的第二個問題,有在EJB QL 2.1 CONCAT功能,所以我認爲以下應工作:

WHERE(LIKE p.name CONCAT( '%',CONCAT(1' %')))

編輯:上述不起作用,因爲該語法QL僅允許文字串和輸入參數在LIKE表達,這是真的限制性的。它應該可以通過使用LOCATE功能這樣才達到同樣的效果:

WHERE LOCATE(p.name, ?1) <> 0 
+0

沒有抱歉,這不起作用(給出語法錯誤) – phunehehe 2010-08-04 13:20:08

+0

謝謝,實際上它是'WHERE LOCATE(?1,p.name)<> 0 ',如果用在像'ejb-jar.xml'這樣的xml文件中,它必須是'WHERE LOCATE(?1,p.name)< > 0' – phunehehe 2010-08-05 02:44:44

2

用於EJB 2.x實體bean(不與JPA和EJB3實體bean中使用的JPQL混淆)的EJB-QL非常有限。儘管在EJB 2.1中有some additions語言,但我的信念沒有上/下函數。

我不知道你在哪個容器中運行,但JBoss已經對EJB-QL進行了一些擴展(稱爲JBossQL)並具有功能。

+0

感謝您的信息,但我使用glassfish v2.1 – phunehehe 2010-08-05 02:23:57