Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 非一致性结果异常:JPARepository Spring boot_Hibernate_Spring Boot_Spring Data Jpa_Hql - Fatal编程技术网

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));