使用this线程(这是非常有帮助的)所以我也可以这样做jpql查询(非常简单,只需选择所有记录但需要按'NAME'字段排序):
SELECT o, LOWER(o.name) AS nameInOrder FROM UserGroup o ORDER BY nameInOrder ASC
我正在使用openjpa,不幸的是应用程序给了我
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.myname.app.UserGroup
运行整个jpql的代码是这样的:
public static List<UserGroup> findAllUserGroups(){
return entityManager().createQuery("SELECT o, LOWER(o.name) AS nameInOrder FROM UserGroup o ORDER BY nameInOrder ASC", UserGroup.class).getResultList();
}
我猜,似乎entityManager将o
作为对象,而LOWER(o.name)
作为另一个对象?
请帮助,真的没有看到任何问题,但OpenJPA(v2.2)不合作。
答案 0 :(得分:1)
根据您链接的主题,此查询的返回类型为List<Object[]>
而不是List<UserGroup>
。
一种方法是按原样保留查询,并通过循环从列表中提取UserGroup
:
List<Object[]> results = entityManager().createQuery("SELECT o, LOWER(o.name) AS nameInOrder FROM UserGroup o ORDER BY nameInOrder ASC", UserGroup.class).getResultList();
List<UserGroup> userGroups = new ArrayList<UserGroup>();
for(Object[] result : results) {
userGroups.add( result[0] );
}
return userGroups;
答案 1 :(得分:0)
为了记录,这是我在jonc的建议之后的实现
// find all groups in order
public static List<UserGroup> findAllUserGroups(){
List<Object> results = entityManager().createQuery("SELECT o, LOWER(o.name) AS nameInOrder FROM UserGroup o ORDER BY nameInOrder ASC", Object.class).getResultList();
List<UserGroup> userGroups = new ArrayList<UserGroup>();
for(Object result : results) {
Object[] resultArray = (Object[])result;
userGroups.add((UserGroup)resultArray[0]);
}
return userGroups;
}
考虑result
是从查询中取回的每个记录集
resultArray[0] is `o`,
resultArray[1] is `LOWER(o.name) AS nameInOrder`, which can be ignored and only use for ordering purpose.