[英]JPA EntityManager createQuery() with IN not working
這是失敗的:
List<String> names = new ArrayList<String>();
names.add("sold");
Query query = em.createQuery("FROM PropField propField WHERE propField.name IN (?)");
query.setParameter(1, names);
List<PropField> fields = query.getResultList();
這是這樣的:
List<String> names = new ArrayList<String>();
names.add("sold");
Query query = em.createQuery("FROM PropField propField WHERE propField.name IN (?)");
query.setParameter(1, names.toArray());
List<PropField> fields = query.getResultList();
這個也是:
List<String> names = new ArrayList<String>();
names.add("sold");
Query query = em.createQuery("FROM PropField propField WHERE propField.name IN ?");
query.setParameter(1, names.toArray());
List<PropField> fields = query.getResultList();
以及其他每一種排列。 檢查了文檔,它說第一個選項應該有效。 這是最好的例外。
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String
at org.hibernate.type.StringType.toString(StringType.java:67)
Hibernate的HQL使用setParameterList
,但試圖在這里堅持使用直接JPA。
從JPA 1.0規范:
4.6.4.1位置參數
以下規則適用於位置參數。
- 輸入參數由問號(?)前綴后跟整數指定。 例如:
?1
。- 輸入參數從1開始編號。
注意,在查詢字符串中可以多次使用相同的參數,並且查詢字符串中參數的使用順序不需要符合位置參數的順序。4.6.4.2命名參數
命名參數是以“:”符號為前綴的標識符。 它遵循第4.4.1節中定義的標識符規則。 命名參數區分大小寫。
例:
SELECT c FROM Customer c WHERE c.status = :stat
第3.6.1節描述了用於綁定命名查詢參數的API
所以要么使用(使用命名參數):
List<String> names = Arrays.asList("sold");
Query query = em.createQuery("FROM PropField propField WHERE propField.name IN (:names)");
query.setParameter("names", names)
List<PropField> fields = query.getResultList();
或(帶位置參數):
List<String> names = Arrays.asList("sold");
Query query = em.createQuery("FROM PropField propField WHERE propField.name IN (?1)");
query.setParameter(1, names)
List<PropField> fields = query.getResultList();
兩者都使用Hibernate EM 3.4.0.GA進行了測試。
請注意,強制使用括號括起IN子句的參數是一個錯誤(至少在JPA 2.0中),如上一個答案中所述 。
我使用帶有IN子句的JPA命名查詢遇到了與Hibernate類似的問題。 我使用了語法:“propField.name IN(?1)”
另見: http : //opensource.atlassian.com/projects/hibernate/browse/HHH-4922
和http://opensource.atlassian.com/projects/hibernate/browse/HHH-5126
我無法訪問Hibernate環境來試試這個,但是你試過了
Query query = em.createQuery("FROM PropField propField WHERE propField.name IN elements(?)");
query.setParameter(1, names);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.