java - sqlException : column not found JPA @query

标签 java sql hibernate spring-boot spring-data-jpa

我正在使用 @query 注释,但是当我尝试获取它抛出的记录数时

java.sql.SQLException: Column 'allowPartialPay' not found.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1094) ~[mysql-connector-java-5.1.31.jar:na]
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:997) ~[mysql-connector-java-5.1.31.jar:na]
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:983) ~[mysql-connector-java-5.1.31.jar:na]
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:928) ~[mysql-connector-java-5.1.31.jar:na]
    at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1162) ~[mysql-connector-java-5.1.31.jar:na]
    at com.mysql.jdbc.ResultSetImpl.getBoolean(ResultSetImpl.java:1781) ~[mysql-connector-java-5.1.31.jar:na]

我正在存储库中编写自定义查询。

InvoiceRepository.java

public interface InvoiceRepository extends JpaRepository<Invoice, Integer>{

    Invoice findByInvoiceNumber(String invoiceNumber);

    List<Invoice> findByUserId(int id);

    @Query(value = "select c.id,c.business_name,count(i.id) from client c join invoice i on c.id = i.client_id where i.date <= :agingDate group by c.id",nativeQuery=true)
    List<Invoice> findInvoiceCount(@Param("agingDate")Date agingDate);

}

ReportService.java

if(report.getReportBy().equals("invoiceCount")){
                    result = invoiceRepository.findInvoiceCount(report.getAgingDate());
                }

发票.java

@Entity
@Table
public class Invoice {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")
    private int id;

    @ManyToOne
    private Client client;

    @Column
    private boolean allowPartialPay;
}

数据库

enter image description here

最佳答案

它是在将结果集映射到 java Invoice 类期间出现的(正如您将其声明为方法 findInvoiceCount() 的返回类型 List 一样)。 native 查询在您的情况下返回 Object[] 而不是 List。

可以在异常日志中看到

ResultSetImpl.findColumn(ResultSetImpl.java:1162

所以它发生在查询执行之后的结果映射阶段。

@Query(value = "select c.id,c.business_name,count(i.id) from client 
          c join invoice i on c.id = i.client_id 
           where i.date <= :agingDate group by c.id",nativeQuery=true)
    List<Invoice> findInvoiceCount(@Param("agingDate")Date agingDate);

spring data 从查询结果中获取结果集,并尝试将其逐个字段映射到 Invoice 字段中(尝试构造 Invoice 类)。但实际类型是 Object[]。

如果您需要获取一些 DTO 作为查询结果,其中的字段为结果集:'c.id,c.business_name,count(i.id)',请使用 @SqlResultSetMapping (您可以将选择查询中的结果列映射到你的 dto)。或者将返回类型从 List 更改为 Object[] 并根据需要进行迭代。

这里是 Result Set Mapping: The Basics 的示例.

关于java - sqlException : column not found JPA @query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44858118/

相关文章:

java - 如何在@NamedEntityGraph 中仅加载子图中的指定属性

java - 如何对可嵌入实体属性实现验证约束?

java - JComboBox不显示更新的模型,如何刷新组合框

sql - 创建通用 SQL 查询构建器

mysql - 使用 HQL/SQL 查询以分钟为单位计算日期差异

javascript - Access 数据库数据类型错误

sql - 如何保存 SQL Server Management Studio 中的更改

java - Android 开发新波士顿 *电子邮件*

java - 在 Android 中实现 SOAP API

java - JSTL c :forEach causes @ViewScoped bean to invoke @PostConstruct on every request