如何在Jpa存储库中编写Sql查询?

时间:2016-02-26 05:54:19

标签: java mysql jpa

我正在尝试根据用户的搜索请求显示数据库中的一组记录。我不认为JPA存储库中有一个预定义的方法.Hence我想在存储库中为此编写一个查询

但是在构建期间,有一个例外情况表明" IllegalArgumentException"。

有人可以帮我写一个正确的查询吗?如果有更好的方法,请告诉我。

参数中的loanReport是一个具有用户搜索请求的对象

    public interface LoanReportRepository extends JpaRepository<LoanReport, Long> , JpaSpecificationExecutor<LoanReport> {
    public final static String GET_LOAN_REPORTS = "SELECT * FROM loan_report  WHERE product=loanReport.product";

       @Query(GET_LOAN_REPORTS)
    List<LoanReport> findByPreference(final LoanReport loanReport);

}

2 个答案:

答案 0 :(得分:2)

如果使用sql,也可以尝试以下代码

public interface LoanReportRepository extends JpaRepository<LoanReport, Long> , JpaSpecificationExecutor<LoanReport> {
    public final static String GET_LOAN_REPORTS = "SELECT * FROM loan_report  WHERE product = :product";

       @Query(GET_LOAN_REPORTS,nativeQuery=true)
    List<LoanReport> findByPreference(@Param("product")final String prouduct);    
}

答案 1 :(得分:1)

您可以像这样调用JPQL查询,

public interface LoanReportRepository extends JpaRepository<LoanReport, Long> , JpaSpecificationExecutor<LoanReport> {

public final static String GET_LOAN_REPORTS = "SELECT lr FROM LoanReport lr WHERE product = :product";

@Query(GET_LOAN_REPORTS)
List<LoanReport> findByPreference(@Param("product") product);

此处product可以是直接存储在DB列或其他JPA实体中的值。在后一种情况下,实体的标识符将与LoanReport的外键约束进行映射。

您可以通过直接传递findByPreference属性来调用product

 loanReportRepository.findByPreference(loanReport.product);

有关详细信息,请参阅here。文档非常好。

P.S。

据我所知,没有内置方法只传递一个对象,并希望将其所有/部分属性值映射到实体字段,然后映射到数据库级别列。

另一种选择是使用Spring Data JPA提供的动态查询,其中包含您要搜索的所有字段。有关信息,请参阅here

如果要在搜索查询中使用多个字段,最佳选择是将所有这些可能的参数作为方法参数传递,并将它们映射到查询的参数。此方法还允许您清理或将用户参数值转换为可能存储在数据库级别的其他格式。