Spring 数据JDBC 一对一获取
Spring Data JDBC fetch one to one
我有这个领域模型:
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 声明):
select p.* from project p
inner join projectrecipient pr on pr.project = p.projectid
where p.projectid = :projectId
编辑
当我调试 findById
方法并将此生成的 SQL 用作 Query
值时,它以正确的方式实现。问题是,我的 Project
table 有很多列,所以 Query
值字符串在我的 IDE(A) ...
另一方面,我不能使用 findById
方法,因为我需要一些特定于 postgres 的 similar to
子句 ...
目前没有其他方法可以拼出完整的 SQL 语句,包括以关系名称和 _
为前缀的引用实体的列。
如果您不包含这些列,则引用的实体将被视为 null
Spring 数据团队正在考虑启用一种方法来提供除查询的 select 子句之外的所有内容,但由于需要,将这些想法转化为代码需要相当长的时间其他一些重大变化。
请注意,您可以将查询或其部分提取到 static final
值中,这可能更容易理解。
另请注意,您可以将 *
符号与显式列结合使用(至少在我使用的数据库中是这样,所以像这样的东西就可以了:
select p.*, pr.id as recipient_id
当然,这是否是个好主意的问题可能会引起一些争论。
我有这个领域模型:
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 声明):
select p.* from project p
inner join projectrecipient pr on pr.project = p.projectid
where p.projectid = :projectId
编辑
当我调试 findById
方法并将此生成的 SQL 用作 Query
值时,它以正确的方式实现。问题是,我的 Project
table 有很多列,所以 Query
值字符串在我的 IDE(A) ...
另一方面,我不能使用 findById
方法,因为我需要一些特定于 postgres 的 similar to
子句 ...
目前没有其他方法可以拼出完整的 SQL 语句,包括以关系名称和 _
为前缀的引用实体的列。
如果您不包含这些列,则引用的实体将被视为 null
Spring 数据团队正在考虑启用一种方法来提供除查询的 select 子句之外的所有内容,但由于需要,将这些想法转化为代码需要相当长的时间其他一些重大变化。
请注意,您可以将查询或其部分提取到 static final
值中,这可能更容易理解。
另请注意,您可以将 *
符号与显式列结合使用(至少在我使用的数据库中是这样,所以像这样的东西就可以了:
select p.*, pr.id as recipient_id
当然,这是否是个好主意的问题可能会引起一些争论。