eclipselink - 如何在我的 JPQL 查询中使用 UNION 和 Order by Clause

标签 eclipselink

我在我的项目中使用 eclipse 链接作为 JPA。我正在使用的当前 jar 是 eclipselink-2.5.2。来回答我的问题, 我想在 UNION 组合中使用 Order by。我的 JPQL 查询如下所示

select req from Rqst req  
 WHERE (req.Applc =:SYSTEM_IDENTIFIER1 AND req.procesTyp  =:PROCESS_TYPE1 AND UPPER(req.updtBy) =:UPDATED_BY1) 
 AND req.stat <> :ignoreDeletedRequests 
UNION 
select req from Rqst req 
 WHERE (req.Applc =:SYSTEM_IDENTIFIER2 AND req.procesTyp  =:PROCESS_TYPE2 AND UPPER(req.updtBy) =:UPDATED_BY2) 
 AND req.stat <> :ignoreDeletedRequests 
UNION 
select req from Rqst req 
 WHERE (req.Applc =:SYSTEM_IDENTIFIER3 AND req.procesTyp  =:PROCESS_TYPE3 AND UPPER(req.updtBy) =:UPDATED_BY3) 
 AND req.stat <> :ignoreDeletedRequests 
 ORDER BY req.rqstId ASC

没有 Order by 它对我有用。但是当我使用 Order by 时,我得到 The query contains an malformed ending.

任何人都可以帮助我,我被困了很长时间。

最佳答案

我遇到了和你一样的问题。我通过像这样使用 Collection.sort() 解决了这个问题:

Collections.sort(listObjects, new Comparator<Object[]>() {

                    @Override
                    public int compare(final Object[] record1, final Object[] record2) {
                        int c;
                        c = convertTime(record1[0].toString()).compareTo(convertTime(record2[0].toString()));
                        if (c == 0) {
                            c = record1[1].toString().compareTo(record2[1].toString());
                        }
                        if (c == 0) {
                            c = record1[2].toString().compareTo(record2[2].toString());
                        }
                        if (c == 0) {
                            c = new Long(Long.parseLong(record1[3].toString())).compareTo(Long.parseLong(record2[3].toString()));
                        }
                        if (c == 0) {
                            c = ((Date) record1[4]).compareTo(((Date) record2[4]));
                        }
                        if (c == 0) {
                            c = ((Date) record1[5]).compareTo(((Date) record2[5]));
                        }
                        if (c == 0) {
                            c = new Long(Long.parseLong(record1[6].toString())).compareTo(Long.parseLong(record2[6].toString()));
                        }
                        return c;
                    }

                });

您可以使用 Collention.sort() 对多个字段进行排序;

关于eclipselink - 如何在我的 JPQL 查询中使用 UNION 和 Order by Clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28871323/

相关文章:

java - JPA - 如何访问查询元数据?

java - 异常 [EclipseLink-4003](Eclipse 持久性服务 - 2.3.0.v20110604-r9504):

servlets - javax.ejb.EJBException : Illegal non-business method access on no-interface view

java - 为每个实体使用单独的实体管理工厂是否会导致问题?

nosql - EclipseLink NoSQL 限制、支持、 future

java - GWT 中的 Hibernate 序列化异常但 Eclipselink 中没有

orm - EclipseLink 生成笛卡尔计划而不是 SQL 中的(内部)联接。为什么?

java - Eclipselink:批量读取创建大量查询

合并 myMap 后的 java 8 lambda myMap.stream().count() != myMap.size()

java - JPA-映射问题