【问题标题】:Spring Data JPA - Specifications joinSpring Data JPA - 规范加入
【发布时间】:2017-01-12 14:32:42
【问题描述】:

我有规格:

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)
)

使用后:

personRepository.findAll(spec);

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

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

【问题讨论】:

    标签: java spring jpa


    【解决方案1】:

    我改成:

    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),
            );
        }
    );
    

    现在,它只加入一次。

    【讨论】:

    猜你喜欢
    • 2016-07-22
    • 2016-02-17
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2017-10-28
    相关资源
    最近更新 更多