【问题标题】:Spring Data JDBC fetch one to oneSpring Data JDBC 一对一获取
【发布时间】:2020-09-29 11:25:20
【问题描述】:

我有这个域模型:

final class Project {

    private final @Id
    @With
    long projectId;

    private final String projectType;

    @With
    private final ProjectRecipient projectRecipient;

    @With
    private final Set<PreCalculationCosts> preCalculationCosts;

    @With
    private final Set<PostCalculationCosts> postCalculationCosts;
}

问题:

当我从CrudRepository 调用findById 方法时,属性projectRecipient 被具体化。
我什至在日志中看到所有发出的 sql 语句都是必需的。

当我使用我自己的Query 时,只有一对多属性正在实现(没有为一对一相关项目接收者发布选择语句):

select p.* from project p 
inner join projectrecipient pr on pr.project = p.projectid
where p.projectid = :projectId

编辑
当我调试findById 方法并将此生成的SQL 用作Query 值时,它会以正确的方式实现。问题在于,我的 Project 表有很多列,所以 Query 值字符串在我的 IDE(A) 中是 5 行 ...

另一方面,我不能使用findById 方法,因为我需要一些postgres 特定的similar to 子句...

【问题讨论】:

    标签: java spring spring-data one-to-one spring-data-jdbc


    【解决方案1】:

    目前,除了拼写完整的 SQL 语句(包括以关系名称和 _ 为前缀的引用实体的列)之外,别无选择。 如果您不包含这些列,则引用的实体将被视为null

    Spring Data 团队正在考虑启用一种方法来提供除查询的 select 子句之外的所有内容,但由于需要进行一些其他实质性的其他更改,因此需要相当长的时间才能将这些想法转化为代码。

    请注意,您可以将查询或其部分提取到 static final 值中,这样可能更容易消化。

    还请注意,您可以将* 表示法与显式列结合起来(至少在我使用的数据库中,所以这样的东西就可以了:

    select p.*, pr.id as recipient_id
    

    当然,这是否是一个好主意的问题可能会引起一些争论。

    【讨论】:

      猜你喜欢
      • 2019-05-07
      • 2019-05-05
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 2017-07-17
      • 1970-01-01
      相关资源
      最近更新 更多