gpt4 book ai didi

hibernate - 如何在 Spring Data JPA 中编写动态 native SQL 查询?

转载 作者:行者123 更新时间:2023-12-03 08:10:57 26 4
gpt4 key购买 nike

我需要在 Spring Boot Web 应用程序中对数据库中的多个表编写搜索查询。

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

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

最佳答案

你需要做一个 CustomRepository并添加一个带有 native 查询的方法。
我这样做:

  • 创建您的自定义存储库:
    public interface OcorrenciaRepositoryCustom {
    List<Object[]> getStrings(List<String> valores);
    }
  • 实现您的自定义存储库:
    (实现的名称必须是原始存储库的名称添加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();
    }
    }
  • 从主存储库扩展您的自定义存储库:
    public interface OcorrenciaRepository extends JpaRepository<Ocorrencia, Long>, OcorrenciaRepositoryCustom {
    Ocorrencia findByPosto(Posto posto);
    }
  • 现在,在服务中,您可以从主存储库调用新方法。
    @Autowired
    private OcorrenciaRepository repository;

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

  • 重要的是自定义存储库在 JpaRepositories 搜索的包下 @EnableJpaRepositories("com.test.my.repository")我在这个例子中使用了 Spring-Data-Jpa 1.9。它在我的项目中完美运行。

    关于hibernate - 如何在 Spring Data JPA 中编写动态 native SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41376975/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com