Java 可以在spring boot中生成动态SQL查询吗?

Java 可以在spring boot中生成动态SQL查询吗?,java,spring,spring-boot,spring-data-jpa,Java,Spring,Spring Boot,Spring Data Jpa,我想实现一个包含五个可选变量的搜索函数,并且在每个组合中都使用,因此开关/大小写是不可能的。所以我不能使用内置的spring引导函数,因为它们不是动态的(如果我错了,请纠正我)。 我知道crudepository中有@query注释,但是没有办法用可选参数编写查询? 我试图用jpa编写自己的数据库访问,没有spring boot Crudepository的帮助。 我在手册中读到了这一点: @Autowired @PersistenceContext private EntityManager

我想实现一个包含五个可选变量的搜索函数,并且在每个组合中都使用,因此开关/大小写是不可能的。所以我不能使用内置的spring引导函数,因为它们不是动态的(如果我错了,请纠正我)。 我知道crudepository中有@query注释,但是没有办法用可选参数编写查询? 我试图用jpa编写自己的数据库访问,没有spring boot Crudepository的帮助。 我在手册中读到了这一点:

@Autowired
@PersistenceContext
private EntityManager em;

@Transactional
public List<Persons>searchPersons(params...){}
@Autowired
@持久上下文
私人实体管理者;
@交易的
公共列表搜索人员(参数…{}
但问题是,我的EntityManager总是空的,我不知道为什么。我找了几个小时,什么也没找到

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


非常感谢您的帮助。

您可能想看看规范


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

,您可能需要查看一下规范


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

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

你应该有:

人事安置习惯

个人信息库

接下来,使用自动连接到存储库中的EntityManager实现一个查询

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

以下线程是相关的:

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

你应该有:

人事安置习惯

个人信息库

接下来,使用自动连接到存储库中的EntityManager实现一个查询

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

以下线程是相关的:

你的应用程序应该为每种情况都有单独的dao方法,但不是动态的,这似乎是一种不好的做法。然后服务层应该决定调用哪一个dao方法。你可以在那里检查它的可选性。你自己并没有实例化那个类(
new WhateverClassThatCodeIsIn()
)?(阅读:“我有一个Spring
@Repository
类..)@WildDev这是不可能的。您指的是一个开关案例或一些if案例来决定采取什么措施。但这将是5个可选参数5!案例。为什么生成动态sql语句会是一种不好的做法?@Vertiris。您尝试实现的逻辑很复杂,这表明您的业务层设计中存在错误。also阅读本文,您的应用程序应该为每种情况使用单独的dao方法,而不是动态的dao方法,这似乎是一种不好的做法。然后服务层应该决定调用哪一个dao方法。您可以在那里检查它的可选性。您自己没有实例化该类(
new WhateverClassThatCodeIsIn()
)?(阅读:“我有一个Spring
@Repository
类..)@WildDev这是不可能的。您指的是一个开关案例或一些if案例来决定采取什么措施。但这将是5个可选参数5!案例。为什么生成动态sql语句会是一种不好的做法?@Vertiris。您尝试实现的逻辑很复杂,这表明您的业务层设计中存在错误。also read this立即尝试此操作。但它不起作用。My EntityManager始终为空。`@Autowired@PersistenceContext private EntityManager em;`您需要一个活动事务才能在Spring上下文中注入EntityManager。您可以通过使用@Transactional注释存储库来完成此操作,默认情况下,该类型为“必需”(如果它不存在,它会创建一个).好的,谢谢。它现在似乎可以工作了,但我还需要测试一些东西。我正在使用'@Autowired'注释从我的PersonService调用PersonRepositoryImpl。我的服务有'@Transactional'和'@service'注释。现在尝试了这个。但它不工作。我的EntityManager始终为空。'@Autowired@PersistenceContext private EntityMana'ger em;`您需要一个活动事务来在Spring上下文中注入entitymanager。您可以通过使用@Transactional注释您的存储库来实现这一点,默认情况下,它的类型为“必需”(因此,如果它不存在,它会创建一个)。好的,谢谢。它现在似乎可以工作了,但我还需要测试一些东西。我正在使用“@Autowired”批注从我的PersonService调用PersonRepositoryImpl。我的服务具有“@Transactional”和“@service”批注。