我正在通过多个参数进行搜索,所有参数都是可选的。我立即想到了 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/