Hibernate 非一致性结果异常:JPARepository Spring boot
我将Hibernate 非一致性结果异常:JPARepository Spring boot,hibernate,spring-boot,spring-data-jpa,hql,Hibernate,Spring Boot,Spring Data Jpa,Hql,我将SpringBoot与JPA和QueryDSL一起使用。我已经编写了一个HQL来从表中获取一些自定义记录,但是它抛出了异常。下面我要提到存储库的代码: @Repository public interface LoanOfferRepository extends JpaRepository<LoanOffer, Long>, QuerydslPredicateExecutor<LoanOffer> { @Query("select lo.startDate
SpringBoot
与JPA
和QueryDSL
一起使用。我已经编写了一个HQL
来从表中获取一些自定义记录,但是它抛出了异常
。下面我要提到存储库的代码:
@Repository
public interface LoanOfferRepository extends JpaRepository<LoanOffer, Long>, QuerydslPredicateExecutor<LoanOffer> {
@Query("select lo.startDate,count(*) from LoanOffer lo where lo.loan.fsp= :fsp and lo.startDate between :fromDate and :toDate Group by lo.startDate")
public Map<LocalDate,Integer> getLastMonthLoans(@Param("fsp")Fsp fsp,@Param("fromDate")LocalDate fromDate,@Param("toDate")LocalDate toDate);
}
代码、查询或返回类型是否有问题?但查询似乎工作正常。您的查询结果无法映射到
Map
@Query("select lo.startDate,count(*) from LoanOffer lo where lo.loan.fsp= :fsp and lo.startDate between :fromDate and :toDate Group by lo.startDate")
public List<Object[]> getLastMonthLoans(@Param("fsp")Fsp fsp,@Param("fromDate")LocalDate fromDate,@Param("toDate")LocalDate toDate);
您可以尝试返回List
,而不是Map
@Query("select lo.startDate,count(*) from LoanOffer lo where lo.loan.fsp= :fsp and lo.startDate between :fromDate and :toDate Group by lo.startDate")
public List<Object[]> getLastMonthLoans(@Param("fsp")Fsp fsp,@Param("fromDate")LocalDate fromDate,@Param("toDate")LocalDate toDate);
根据Spring数据文档,
Map
不构成其一部分。甚至JPA(即使是2版本)也不支持在执行的查询中使用
Map
作为返回类型
因此,您有两种解决问题的方法:
1) 将映射保持为返回类型。在这种情况下,不要使用Spring数据功能来免除您编写锅炉板代码。
相反:从EntityManager
创建查询,执行查询并应用后期处理将结果映射到映射中。
如果Map
具有合理的大小,并且您确实需要从存储库中检索Map
,则应该使用这种方法
2) 不要将Map
作为返回类型返回
在这两种情况下,都必须选择已执行查询的返回类型。您大致有两种选择:
1) 将
列为返回类型,但它不一定有意义,也不是类型安全的
2) 表示行结构的自定义类
public class LoanOfferStats{
private LocalDate startDate;
private Long count;
public LoanOfferStats(LocalDate startDate, Long count) {
this.startDate = startDate;
this.count = count;
}
public LocalDate getStartDate(){
return startDate;
}
public Long getCount(){
return count;
}
}
并注释您的方法,例如:
@Query("select new fullpackage.LoanOfferStats(lo.startDate,count(*))
from LoanOffer lo where lo.loan.fsp= :fsp and lo.startDate between
:fromDate and :toDate Group by lo.startDate")
public List<LoanOfferStats> getLastMonthLoans(@Param("fsp")Fsp fsp,@Param("fromDate")LocalDate fromDate,@Param("toDate")LocalDate
toDate);
你应该使用。请检查我的答案,如何从repo返回任意对象。
@Query("select new fullpackage.LoanOfferStats(lo.startDate,count(*))
from LoanOffer lo where lo.loan.fsp= :fsp and lo.startDate between
:fromDate and :toDate Group by lo.startDate")
public List<LoanOfferStats> getLastMonthLoans(@Param("fsp")Fsp fsp,@Param("fromDate")LocalDate fromDate,@Param("toDate")LocalDate
toDate);
List<LoanOfferStats> loanOfferStats = loanOfferRepository.getLastMonthLoans(...);
Map<LocalDate, Long> map =
loanOfferStats.stream()
.collect(Collectors.toMap(LoanOfferStats::getStartDate, LoanOfferStats::getCount));