【问题标题】:How to implement a search by multiple params in spring boot if I have unrelated entities?如果我有不相关的实体,如何在 Spring Boot 中通过多个参数实现搜索?
【发布时间】:2020-01-11 11:54:10
【问题描述】:

我正在按多个参数进行搜索,它们都是可选的。我立刻想到了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);

但这是不可能的。

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

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

【问题讨论】:

  • 所有表的结构都一样?
  • 不,只涉及这四个表。
  • 他们有不同的列?
  • 是的,code_tableN的结构也不同。
  • 查询 q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a"); List 作者 = q.getResultList();

标签: java hibernate spring-boot jpa


【解决方案1】:

假设您有一个表 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 and an @ManyToOne。您需要在表之间建立某种关联才能执行上例中的查询。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2016-11-09
    • 2019-02-14
    • 1970-01-01
    相关资源
    最近更新 更多