Spring Data JDBC一对一获取

问题描述

我有这个域模型:

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

当然,如果这是一个好主意,可能会引起一些争论。