当前位置: 首页 > 知识库问答 >
问题:

使用JPQL时发生Spring JPA存储库转换错误

笪波鸿
2023-03-14

我声明了一个分页和排序JPA存储库。我正在使用@Query注释。

当我从存储库的findById(id)方法对可选对象调用get()方法时,我遇到了一个异常。

奇怪的是,它只发生在我使用JPQL的时候。

如果我的查询是本机查询,则代码有效:

    @Override
public BatchDto findById(String id) {
    Optional<Batch> findResult =  this.batchRepository.findById(id);
    if (!findResult.isPresent()) return null;
    Batch entity = findResult.get();  **<-------- Cast Exception Here**
    BatchDto dto = this.mapper.toDto(entity, BatchDto.class);
    List<BatchTransaction> transactions = entity.getTransactions();
    dto.setTransactionDtos(mapper.toListDto(transactions, TransactionDto.class));
    return dto;
}

使用断点检查findResult对象-我可以看到:

Optional[net.domain.data.batch@4b8bb6f] 

当我在@Query注释中有nativeQuery=true时。

@Query(value = Sql.FindBatchById, nativeQuery = true) 

以下是正在使用的查询:

SELECT DISTINCT(B.batchNumber), COUNT(B.batchNumber) as TransactionCount FROM BATCH B WHERE B.batchReferenceNumber = :id GROUP BY B.batchNumber

但是,如果我将其更改为JPQL并删除nativeQuery=true属性,则findResult是

Optional[[Ljava.lang.Object;@76e04327].  

我得到一个ClassCastException:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to net.domain.data.batch

所以底线——当指定nativeQuery=true时,这是有效的,当我尝试使用JPQL时,这是失败的。

我不希望指定nativeQuery,因为我们最终会将这个数据库移植到Oracle。

共有1个答案

孙元明
2023-03-14

首先,下面显示的查询不会返回单个Batch实例。由于存在不同的集合函数,查询将返回集合函数的列表。为了能够读取统计信息,您可以将适当的方法添加到batchRepository中。像这样的东西:

@Query("SELECT DISTINCT(B.batchNumber) as dist, COUNT(B.batchNumber) as cnt FROM BATCH B GROUP BY B.batchNumber")
  List<Map<Long, Long>> findStatistics();

然后遍历列表。

UPD

如果id参数完全保证返回单个记录,则可以将返回类型更改为Map

@Query("SELECT DISTINCT(B.batchNumber) as dist, COUNT(B.batchNumber) as cnt FROM BATCH B WHERE B.batchReferenceNumber = :id GROUP BY B.batchNumber")
      Map<Long, Long> findStatisticsById(@Param("id") Long id);
 类似资料:
  • 我的for-each循环中出现了这个错误:

  • 问题内容: 在使用声纳运行器分析多模块项目时,我经常遇到“读取超时”错误。我已经用SonarQube 5.1.1配置了Jenkins。我们的项目是一个Web项目,我们有几个用于网络分析的声纳插件,例如web,css,java,findbugs,js,xml和jacoco。如果我从浏览器加载给定的链接“ http://172.21.145.84:9000/batch/project?key=webp

  • 问题内容: 我正在使用JSF设置表单(这是我的新手),并且在其中一个字段上收到消息。该字段实际上是一个具有自定义转换器的单独对象(如下文所示)。 这是我所拥有的(删除了不相关的代码): 我有一堂课: 我也有一个您在该类中引用的类: 那么对于我的表格,我有: 最后,对于我的转换器,我有: 现在,当我进入表单并提交时,我将获得状态旁边的内容。我在这方面还很新,感谢@BalusC,我一直很远。 任何帮助

  • 我正在尝试实现一个简单的REST服务,该服务基于具有Spring启动和Spring数据Rest的JPA存储库。(请参阅此教程)如果将以下代码与 gradle 一起使用,则运行良好: 为了让事情变得更简单,我使用Spring boot CLI(“Spring run”命令)尝试了相同的代码。 不幸的是,这似乎不起作用@RepositoryRestResource似乎无法像@RestControlle

  • 我的猫鼬函数 错误消息:模型"myinfo"的路径"_id"处的值"计数"转换为ObjectId失败"

  • 我对SpringData和JPA有问题。当我向HomeRepository接口添加方法时,我得到一个错误。我使用的是JPararePository接口,在pom.xml文件中有一个MySQL数据库集。这些只是我对spring的开始,所以我需要一些了解spring的人的帮助。下面是我的代码和日志: 主页库: 用户存储库: 日志: