问题描述
我有这个域模型:
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;
}
问题:
当我从findById
调用CrudRepository
方法时,属性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
子句...
解决方法
当前,除了拼写完整的SQL语句外,别无选择,包括引用实体的列,关系名称和_
前缀。
如果您不包括这些列,则所引用的实体将被视为null
Spring Data团队正在考虑启用一种方法来提供除查询的select子句以外的所有内容,但是由于需要进行其他一些其他实质性更改,因此将这些想法转化为代码还需要花费一些时间。
请注意,您可以将查询或其部分提取为static final
值,这可能使摘要更容易理解。
还请注意,您可以将*
表示法与显式列组合在一起(至少在我使用过的数据库中如此,这样就可以了:
select p.*,pr.id as recipient_id
当然,如果这是一个好主意,可能会引起一些争论。