Spring Data JPA - 规范加入

Bye*_*Bye 7 java spring jpa

我有规格:

final String text = "%text%";
final Specifications<PersonEntity> spec = Specifications.where(
    (root, query, builder) -> builder.like(builder.lower(root.join(PersonEntity_.addresses, JoinType.LEFT).get(AddressEntity_.addressLine1)), text)
).or(
    (root, query, builder) -> builder.like(builder.lower(root.join(PersonEntity_.addresses, JoinType.LEFT).get(AddressEntity_.addressLine2)), text)
).or(
    (root, query, builder) -> builder.like(builder.lower(root.join(PersonEntity_.addresses, JoinType.LEFT).get(AddressEntity_.city)), text)
)
Run Code Online (Sandbox Code Playgroud)

使用后:

personRepository.findAll(spec);
Run Code Online (Sandbox Code Playgroud)

在日志中,我看到,JPA创建了一个查询,它连接地址三次而不是一次.

如何编写一个只连接一次地址的规范?

Bye*_*Bye 16

我改成了:

Specifications.where(
    (root, query, builder) -> {
        final Join<PersonEntity, AddressEntity> addresses = root.join(PersonEntity_.address, JoinType.LEFT);
        return builder.or(
            builder.like(builder.lower(addresses.get(AddressEntity_.addressLine1)), text),
            builder.like(builder.lower(addresses.get(AddressEntity_.addressLine2)), text),
            builder.like(builder.lower(addresses.get(AddressEntity_.code)), text),
        );
    }
);
Run Code Online (Sandbox Code Playgroud)

现在,它只加入一次.