JPQL查询:使用ORDER BY case不敏感

时间:2013-04-02 21:03:36

标签: sql java-ee jpa jpql openjpa

使用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)不合作。

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.