如何在Spring数据JPA中编写动态本机SQL查询?

时间:2016-12-29 09:42:29

标签: hibernate spring-data-jpa

我需要在spring boot web应用程序中的数据库中的多个表上编写搜索查询。

它使用spring数据jpa。我知道我们可以使用@Query annotation和native = true标志在spring数据jpa中编写本机查询。

有没有什么方法可以在存储库类中编写查询而不是@Query注释,因为Query非常复杂和动态。

1 个答案:

答案 0 :(得分:0)

您需要执行一个CustomRepository并添加带有本机查询的方法。

我这样做:

  1. 创建您的自定义存储库:

    public interface OcorrenciaRepositoryCustom { List getStrings(List valores); }

  2. 实施您的自定义存储库: (实现的名称必须是原始存储库的名称,并以Impl作为后缀。)

public class OcorrenciaRepositoryImpl implements OcorrenciaRepositoryCustom { @PersistenceContext private EntityManager entityManager;

    @Override
    public List<Object[]> getStrings(List<String> strings) {
        StringBuilder sb = new StringBuilder();
        sb.append("SELECT count(o.id) FROM soebm.ocorrencia o WHERE 1=1 ");

        if(strings.get(0)!=null && StringUtils.isNotEmpty(strings.get(0))) {
            sb.append(" AND to_char(o.date, 'YYYY-MM-DD') >= :dataInicio ");
        }

        Query query = entityManager.createNativeQuery(sb.toString());

        if(strings.get(0)!=null && StringUtils.isNotEmpty(strings.get(0).toString())) {
            query.setParameter("dataInicio", strings.get(0));
        }

        return query.getResultList();
    }
}
  1. Extend your custom repository from main repository:

    public interface OcorrenciaRepository extends JpaRepository, OcorrenciaRepositoryCustom { Ocorrencia findByPosto(Posto posto); }

4.Now, in the service, you can call your new method from the main repository.

@Autowired private OcorrenciaRepository repository;

public List<Object[]> findOcorrenciaCustom(String str) {
        List<String> strings = new ArrayList<String>() {{add(dataInicio);}};
        return repository.getStrings(strings);

}

It is important that the custom repository is under the package searched by JpaRepositories

@Override public List<Object[]> getStrings(List<String> strings) { StringBuilder sb = new StringBuilder(); sb.append("SELECT count(o.id) FROM soebm.ocorrencia o WHERE 1=1 "); if(strings.get(0)!=null && StringUtils.isNotEmpty(strings.get(0))) { sb.append(" AND to_char(o.date, 'YYYY-MM-DD') >= :dataInicio "); } Query query = entityManager.createNativeQuery(sb.toString()); if(strings.get(0)!=null && StringUtils.isNotEmpty(strings.get(0).toString())) { query.setParameter("dataInicio", strings.get(0)); } return query.getResultList(); } }

在此示例中,我使用了Spring-Data-Jpa 1.9

在我的项目中效果很好。