java - 如果我有不相关的实体,如何在 spring boot 中通过多个参数实现搜索?

标签 java hibernate spring-boot jpa

我正在通过多个参数进行搜索,所有参数都是可选的。我立即想到了 Criteria API,但这是我开发的一个特殊性。问题是,我需要构建查询的主表是一个不相关的实体:

main_table       table1      table2       table3
id_main_table   id_table1    id_table2    id_table3
code_table      code_table1  code_table2  code_table3

其中 code_table 可能包含 code_tableN 的任何值

我了解到Criteria API 尚不支持不相关的实体。

我正在考虑将 WHERE 子句作为字符串参数发送到存储库,如下所示:

@Query(value = "SELECT entity FROM ... WHERE " + where)
List<Entity> findEntitiesByParams(@Param("where") String where);

但那是不可能的。

如果可能的话,我想避免使用原生查询。

有什么想法吗?非常感谢。

最佳答案

假设您有一个表 T1 通过外键链接到表 T2。然后你可以做

@Query(select t1 from TableOne t1 join fetch t1.childTwo t2 where t1.property = ?1  and t1.attribute = ?2 and t2.childProperty = ?3)
public Optional<TableOne> getChildTableTwo(String property, Integer attribute, Double childProperty);

例如。请注意,这是 HQL 语法,因此不依赖于特定的 SQL 方言。

从您的问题来看,您有兴趣做类似但使用多个表(和多个连接)的事情。据我所知,这只有在每个表都通过外键关系链接时才有可能——存储库应该是与所有其他感兴趣的实体相关的实体,即

T1 (parent) -> (child) T2 (parent) -> (child) T3 (parent) -> (child) T4
Or, 
T1 (parent) -> (child) T2
            -> (child) T3
            -> (child) T4
, for example. 

因此,如果主键链接到多个外键,则 T1 将有一个 @OneToMany,而外键表将有一个 @ManyToOne。如果一个外部表也是一个父表,那么如果它有一个链接到多个子表的键,它就会同时有一个@OneToMany 和一个@ManyToOne。您需要在表之间建立某种关联才能执行如上例中的查询。

要使参数可选,您可能需要有点创意 - 我不知道这方面的最佳做法。例如,一种解决方案是 where (T.property = ?1 OR T.property = null) && ...

如果您的问题还有其他我没有解决的问题,请告诉我。我不确定您是对执行使用多个表的查询更感兴趣,还是只想了解 ?1 是如何被 String property 引用的例子。后一种情况之所以有效,是因为 ?1 引用了签名中的第一个参数。

关于java - 如果我有不相关的实体,如何在 spring boot 中通过多个参数实现搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57858675/

相关文章:

java - 如何在没有 get/set 方法的情况下获取对象 JSON

java - 在java中返回 boolean 值?

Java:如何使用循环创建字符串而不打印?

java - [Ljava.lang.String;@输出错误

java - SQL Server 2012 上的 "New request is not allowed to start because it should come with valid transaction descriptor"

java - 在 Java 持久性中较旧的查询

java - 如何创建依赖于 Spring Bean 的自定义 Spring PropertySource

java - 如何从 ResultSet 获取要更新的 JTable 数据

java - 使用 Quarkus 和 PanacheRepository 更新实体数据不起作用

gradle - Spring 靴大战