2013-04-02 104 views
1

使用this線程(這是非常有用的),所以我做同樣可以JPQL查詢(很簡單,只需選擇所有記錄,但需要由「姓名」字段排序):JPQL查詢:使用ORDER BY情況下不區分大小寫

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

回答

1

根據您鏈接到的線程,此查詢的返回類型爲List<Object[]>而不是List<UserGroup>

一個otion是離開查詢原樣,並通過遍歷它拔出從列表中UserGroup 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; 
+0

ŧ帽子非常好找!我很遺憾,沒有完成在該線程上的整個答案:) – Dreamer

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. 
相關問題