2016-09-05 3 views
2

Ich habe Spezifikation:Spring Data JPA - Spezifikationen beitreten

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

Nach der Verwendung:

personRepository.findAll(spec); 

In logs Ich sehe, dass JPA-Abfrage erstellen, wo es Adressen dreimal statt einmal beitritt.

Wie kann ich Spezifikation schreiben, wo Adressen nur einmal beitreten?

Antwort

7

habe ich es zu:

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

Jetzt ist es nur einmal beitritt.

Verwandte Themen