【问题标题】:Is it possible to generate a dynamic SQL query in spring boot?是否可以在 Spring Boot 中生成动态 SQL 查询?
【发布时间】:2016-10-03 04:52:29
【问题描述】:

我想在每个组合中实现一个包含五个可选变量的搜索功能,因此开关/案例不是一种可能的方式。所以我不能在spring boot函数中使用构建,因为它们不是动态的(如果我错了,请纠正我)。 我知道 crudrepository 中有 @query 注释,但是没有办法编写带有可选参数的查询? 我尝试使用 jpa 编写自己的数据库访问,而没有 spring boot CrudRepository 的帮助。 我在手册中读到这应该可以工作:

@Autowired
@PersistenceContext
private EntityManager em;

@Transactional
public List<Persons>searchPersons(params...){}

但问题出在这里,我的 EntityManager 始终为空,我不知道为什么。我搜索了几个小时,一无所获。

也许你们知道一种在 Spring Boot 中编写动态 SQL 查询的方法。 CrudRepository 中有没有办法为查询定义可选参数? 顺便说一句,我使用 postgreSQL 数据库。

非常感谢您的帮助。

【问题讨论】:

  • 你的应用应该有针对每种情况的独立 dao 方法,但不是动态的,这似乎是一种不好的做法。然后服务层应该决定调用哪一种 dao 方法。你可以在那里检查它的可选性。
  • 您自己没有实例化该类 (new WhateverClassThatCodeIsIn())? stackoverflow.com/questions/19896870/…(阅读:“我有一个 Spring @Repository 类..
  • @WildDev 这是不可能的。你的意思是一个 switch 案例或一些 if 案例来决定采取什么。但这将是由 5 个可选参数 5!案例。为什么这是生成动态 sql 语句的坏习惯?
  • @Mortalis,http://stackoverflow.com/a/3415629/3019024。您尝试实现的逻辑很复杂,这表明您的业务层设计存在错误。

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


【解决方案1】:

您可能想查看规格。

See the documentation here

为此,您的存储库接口需要实现JpaSpecificationExecutor

【讨论】:

    【解决方案2】:

    您可以使用自定义存储库(创建自己的接口,为其编写一个 Impl 类并通过该接口扩展您的存储库。

    你应该有:

    PersonRepositoryCustom

    PersonRepositoryCustomImpl

    接下来,您使用自动装配到您的存储库中的 EntityManager 来实现一个查询。您可以使用 JPQL 或 JPA 2.1 Criteria API 来做到这一点。

    对于每个参数,有一个条件将其添加到查询本身,以及准备好的语句参数。这样,您就可以构建动态查询。

    以下线程是相关的: Best way to create JPA query that might contain a parameter or might not

    【讨论】:

    • 现在试过了。但它不起作用。我的 EntityManager 始终为空。 ` @Autowired @PersistenceContext 私有 EntityManager em; `
    • 您需要一个活动事务来将实体管理器注入 Spring 上下文中。您可以通过使用 @Transactional 注释您的存储库来做到这一点,默认情况下它的类型是“REQUIRED”(因此如果它不存在,它会创建一个)。
    • 好的,谢谢。它现在似乎有效,但我必须测试更多的东西。我使用“@Autowired”注释从我的 PersonService 调用 PersonsRepositoryImpl。我的服务有“@Transactional”和“@Service”注释。
    【解决方案3】:

    我知道这个问题很老了,但是对于任何来这里有兴趣实现动态 SQL 查询的人来说,看看这两篇博文,它们很棒。

    1. Implementing dynamic SQL queries using Spring Data JPA Specification and Criteria API
    2. Writing dynamic SQL queries using Spring Data JPA repositories and EntityManager

    【讨论】:

      猜你喜欢
      • 2018-10-11
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 2017-10-05
      • 2018-08-02
      • 1970-01-01
      • 2017-01-03
      • 2018-08-05
      相关资源
      最近更新 更多