2012-05-31 52 views
2

我能夠使用枚舉類型(使用JPA/Hibernate)存儲,檢索和查詢實體。枚舉字段用@Enumerated(EnumType.STRING)註釋。使用LIKE運算符對帶有枚舉的實體執行JPA查詢(EnumType.STRING)

是否可以做"SELECT a FROM MyEntity a WHERE a.myEnum LIKE :param"這樣的事情?

這個想法是讓它匹配enum值字符串(在數據庫中)匹配模式(如「SYSTEM_%」或「BUSINESS_%」)的任何實體。

感謝您的幫助。

---更新:

當我試圖用這個查詢:

`@Query("SELECT e FROM MyEntity e WHERE e.myEnum LIKE :value")` 

中的值(表示比賽什麼...):

%%

我得到這個例外:

Caused by: java.lang.IllegalArgumentException: Parameter value [%%] did not match expected type [mypackage.MyEntity$MyEnum] 
     at org.hibernate.ejb.AbstractQueryImpl.validateParameterBinding(AbstractQueryImpl.java:370) 
     at org.hibernate.ejb.AbstractQueryImpl.registerParameterBinding(AbstractQueryImpl.java:343) 
     at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:374) 
     at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:71) 
+0

你確定要使用像那裏,而不是=? – Jeshurun

+0

是的,我是。這有點奇怪,但目的是提供枚舉的字符串值(存儲在db中)的「通過部分值的簡單搜索過濾器」。所以如果用戶輸入「system」,它應該只返回以「system ***」開頭的枚舉。 – kctang

+0

我已經更新了我的答案。我已經測試過這個,它確實是你想要的。 – Jeshurun

回答

2

絕對。只需使用query.setString("param", "BUSINESS_%");即可。請注意,使用setParameter()而不是setString()會在Hibernate嘗試將其強制轉換爲枚舉時拋出ClassCastException,但setString()完全符合您的要求。

+0

我明白了,所以這可能會起作用,但我現在不能「測試」這個,因爲我正在使用Spring Data JPA> JPA> Hibernate。請記住,如果我得到這個驗證,將在未來打勾你的答案。謝謝! – kctang

+0

據說在hibernateTemplat中有一個快捷方式: – tibi

+0

setString不再存在 – Dan

0

saidly沒有在org.springframework.orm.hibernate3.HibernateTemplate快捷方式:

protected void applyNamedParameterToQuery(Query queryObject, String paramName, Object value) 
     throws HibernateException { 

    if (value instanceof Collection) { 
     queryObject.setParameterList(paramName, (Collection) value); 
    } 
    else if (value instanceof Object[]) { 
     queryObject.setParameterList(paramName, (Object[]) value); 
    } 
    else { 
     queryObject.setParameter(paramName, value); 
    } 
} 

將是馬麗娟,如果有一個額外否則,如果(值instanceoff字符串)...

0

作爲解決方法,您可以通過將模式連接到查詢來構建查詢。

em.createQuery("SELECT e FROM MyEntity e WHERE e.myEnum LIKE '" + pattern +"'") 

它的工作原理與Hibernate以及EclipseLink的。

但是,不要試圖用pattern這個用戶輸入,因爲用這種方式構建查詢容易受到sql注入攻擊。

+0

用Hibernate 4.3.6測試.Final和Eclipselink 2.5.1 – zbig