【问题标题】:JPQL query: use ORDER BY case insensitivelyJPQL 查询:不区分大小写地使用 ORDER BY
【发布时间】:2013-03-24 08:24:51
【问题描述】:

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

【问题讨论】:

    标签: sql jakarta-ee jpa jpql openjpa


    【解决方案1】:

    根据您链接到的线程,此查询的返回类型是 List&lt;Object[]&gt; 而不是 List&lt;UserGroup&gt;

    一种选择是保留查询原样并通过循环从列表中提取UserGroups:

    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;
    

    【讨论】:

    • 这是非常好的发现!我是如此倾倒,以至于没有完成该线程上的整个答案:)
    【解决方案2】:

    为了记录,这是我按照 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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 2023-03-27
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多