有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java PSQL/JPA:将查询从返回的事件列表<>重写为映射<日期,每个日期的事件列表<>>

我有一个预定义的查询/jpa操作

jpaOperations.findByQuery(ActivityCountByCategory.class,
"SELECT NEW ActivityCountByCategory(u.text, count(1)) 
FROM Activity a JOIN a.groupCategories c, UserDefinedCode u 
WHERE (u.id.code = c AND u.id.entityName='AKTOR_AKTIVITET' AND u.id.fieldName='KATEGORI') 
AND a.closedIndicator = 'F' GROUP BY u.text, u.lineNo ORDER BY u.lineNo");

它返回一个名为ActivityCountByCategory的DTO列表,其中包含一个活动的名称和一个表示数据库中发生的事件的数字。 因此,该方法返回所有时间的单个活动数

UserDefinedCode

这些表的定义使得这些活动位于AKTOR_AKTIVITET中,并且有一个从第二个表UserDefinedCode引用的ID,这样名称部分就与活动分离了

我需要扩展这个查询,这样我就可以从Date和Date-to-Date传递一个日期,并让它返回某种形式的List<Object[]>Map<Date, List<ActivityCountByCategory>>,这样就不用一次返回所有事件,而是可以将事件拆分为单独的日期between fromDate and toDate,并将每个返回列表映射到一个特定的日期


共 (1) 个答案

  1. # 1 楼答案

    我用原生SQL重写了查询,并编辑了DTO以说明日期,然后在支持bean java代码中进行了一些解析:

    public List<ActivityCountByCategory> getCreatedUserDefinedActivityCountByDate(Date fromDate, Date toDate) {
    
            Query query;
            query = entityManager.createNativeQuery("SELECT" +
                    " trunc(a.dato), fcode.TEXT, COUNT(1) FROM ACTIVITY a INNER JOIN ACTIVITY_CATEGORY act_cat ON a.ID=act_cat.ACTOR_ID INNER JOIN " +
                    "user_defined_code fcode ON fcode.kode = act_cat.category where ... " + 
                    "AND trunc(a.DATO) BETWEEN :fromDate AND :toDate GROUP BY trunc(a.dato), fcode.TEXT , fcode.lineNo ORDER BY fcode.lineNo ");
            query.setParameter("fromDate", fromDate);
            query.setParameter("toDate", toDate);
    
            List<Object[]> resultList = query.getResultList();
            List<ActivityCountByCategory> list = new ArrayList<>();
            for (Object[] result : resultList) {
                list.add(new ActivityCountByCategory((String) result[1], (Number) result[2], (Date) result[0]));
            }
            return list;
        }