【问题标题】:sqlException : column not found JPA @querysqlException:找不到列 JPA @query
【发布时间】:2017-12-05 02:26:50
【问题描述】:

我正在使用 @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());
                }

Invoice.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;
}

数据库

【问题讨论】:

  • @NeilStockton 我已经更新了我的存储库代码
  • 它来自发票表,调用的查询是'select c.id,c.business_name,count(i.id) from client c join invoice i on c.id = i.client_id where i .date
  • @NeilStockton 我也添加了调用哪个方法的服务
  • 由于您正在运行本机查询,因此从您的查询方法返回 List&lt;Object[]&gt;

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


【解决方案1】:

它是在将结果集映射到 java Invoice 类期间出现的(因为您将其声明为方法 findInvoiceCount() 的返回类型 List)。本机查询在您的情况下返回 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 的示例。

【讨论】:

    猜你喜欢
    • 2021-04-10
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多