簡體   English   中英

使用IN的JPA EntityManager createQuery()不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM