自定义Query查询,可否包装内容到一个非持久化的实体.

如图,jpql内的查询结果只能是query标签内的实体吗?

可否如下图,返回一个自定义的非持久化的实体.

另外,可否将jpql查询出来的某个字段经过一段逻辑处理后,再给个名字塞到返回实体里?仅仅在jpql中进行的聚合等基础操作无法满足我的需求.

ps:

  1. 我已知视图可以指定返回属性,但是我想查询的属性在我自定义的对象里返回.
  2. 我已知调用service可以在查询后对字段进行自定义逻辑处理并返回,但是rest接口调用service就没有分页了,我需要像调用query一样,具备分页功能.

以上 :grinning:

你好,
JPA 是支持在查询语句中 new 一个新的实体。参考这里:https://www.objectdb.com/java/jpa/query/jpql/select
但是我不确定CUBA 的RestAPI 封装是否支持这种用法,你可以先试试,有问题再沟通。

首先我用RestAPI是不行的,
其次,我尝试在service中使用dataManager加载数据,将cubarest_TblCallRecords实体的数据进行一定聚合操作后,加载到非持久对象RecordStatictis种,代码如下:

        LoadContext<RecordStatictis> context = LoadContext.create(RecordStatictis.class)
                .setQuery(LoadContext.createQuery("SELECT NEW com.voiceai.cubarest.entity.business.RecordStatictis(SUM(IF(gender=1,1,0)),SUM(IF(gender=1,0,1)))" +
        List<RecordStatictis> list = dataManager.loadList(context);
        list.forEach(System.out::println);

cubarest_TblCallRecords实体:


RecordStatictis元数据:

但是查询出来的结果为空:

请帮忙确认下是否我的操作方式有误,还是此方式不支持,
另外,将数据库的内容进行多种分组,聚合等操作后拿到业务层是我的刚需(数据量较大,不可能全部拿过来在业务层处理),所以如果我的方式不行请告知下是否有其他迂回的办法.感谢~

你好,
如果你能提供一个简单测试项目,我们可以帮你确认一下上面的问题。
另外,如果是简单的汇总查询,可使用 DataManager.loadValues方法,参考这里

loadValues(ValueLoadContext) - 加载键值对列表。该方法接受 ValueLoadContext ,定义纯数值的查询语句和键值列表。返回包含 KeyValueEntity 实例的列表。例如:

DataManager

看看能否满足需求。

你好,我尝试使用了dateManager和entityManager之后,发现entityManager可以返回结果,dataManager不行,不知是否原因如下:

单元测试文件地址:

https://github.com/Wjcccccccccc/cuba-singleNode/blob/master/modules/core/test/com/voiceai/cubarest/core/RecordServiceBeanTest.java

另外:
我将cuba平台升级到7.2.4之后测试,发现调用EntityManager非常慢,并且后面的日志都不输出了,回滚到7.2.3就好了(具体调用请参看我上述测试文件地址),感觉像是个Bug.