使用 Spring 数据 JPA 规范进行组合时如何使用连接

时间:2021-07-15 12:21:16

标签: java spring-data-jpa specifications

假设我有两个静态方法:

public static Specification<SomeEntity> isSomeValue() {
    return (root, query, builder) -> {
        Join<SomeEntity, JoinEntity> join = root.join("joinEntity");
        return builder.equal(join.get("someProperty"), "someValue");
    };
}

public static Specification<SomeEntity> isSomeOtherValue() {
    return (root, query, builder) -> {
        Join<SomeEntity, JoinEntity> join = root.join("joinEntity");
        return builder.equal(join.get("someOtherProperty"), "someOtherValue");
    };
}

我可以只需要两者之一或两者都需要。当我需要两者时,我会使用组合并做类似的事情

someEntityRepository.find(isSomeValue().and(isSomeOtherValue()));

我的问题是:当两种方法都使用相同的连接时,可以编写规范吗?我应该保持这样还是应该做另一种方法以免重复加入?

当然,上面是简化的假例子。我试图更好地了解它在表面下是如何工作的。

1 个答案:

答案 0 :(得分:1)

如果您将这两个规范结合起来,您最终会得到两个连接,这可能不是您想要的。 您可以使用 root.getJoins() 来确定连接是否已经存在,如果存在,则将其用于谓词,否则创建一个新连接。

相关问题