gmo*_*ore 7 java orm hibernate jpa
这是失败的:
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();
Run Code Online (Sandbox Code Playgroud)
这是这样的:
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();
Run Code Online (Sandbox Code Playgroud)
这个也是:
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();
Run Code Online (Sandbox Code Playgroud)
以及其他每一种排列.检查了文档,它说第一个选项应该有效.这是最好的例外.
java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String
at org.hibernate.type.StringType.toString(StringType.java:67)
Run Code Online (Sandbox Code Playgroud)
Hibernate的HQL使用setParameterList,但试图在这里坚持使用直接的JPA.
Pas*_*ent 21
从JPA 1.0规范:
4.6.4.1位置参数
以下规则适用于位置参数.
- 输入参数由问号(?)前缀后跟整数指定.例如:
?1.- 输入参数从1开始编号.
请注意,在查询字符串中可以多次使用相同的参数,并且查询字符串中参数的使用顺序不必符合位置参数的顺序.4.6.4.2命名参数
命名参数是以":"符号为前缀的标识符.它遵循第4.4.1节中定义的标识符规则.命名参数区分大小写.
例:
Run Code Online (Sandbox Code Playgroud)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();
Run Code Online (Sandbox Code Playgroud)
或(带位置参数):
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();
Run Code Online (Sandbox Code Playgroud)
两者都使用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
| 归档时间: |
|
| 查看次数: |
38529 次 |
| 最近记录: |