1

使用这个线程(这很有帮助)所以我对可能 jpql 查询做同样的事情(非常简单,只需选择所有记录但需要按“名称”字段排序):

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();
}

我的猜测,似乎 entityManagero作为一个对象,但LOWER(o.name)作为另一个?

请帮忙,真的没有看到任何问题,但 OpenJPA(v2.2) 不合作。

4

2 回答 2

1

根据您链接到的线程,此查询的返回类型是List<Object[]>and not List<UserGroup>

UserGroup一种选择是让查询保持原样并通过循环从 List 中拉出s:

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;
于 2013-04-02T21:26:38.617 回答
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.
于 2013-04-03T15:47:21.947 回答