2016-04-01 15 views
1

私は、Spring Data +仕様+基準APIを持つSpringプロジェクトを使用して立ち往生しました。Spring仕様の基準複数の結合?どうやって?

簡単な例を得るために書いた一般的なエンティティを使って状況をシミュレートしようとします。

エンティティ: は、各エンティティのすべての属性を考えてみましょうが、コンストラクタに渡されたが、

(ロングID、文字列の名前、文字列のISO)
州立(ロングIDの下に示しました。文字列名、文字列のISO)
(ロングID、文字列名、文字列のISO)

これは私のリポジトリです:

public interface CityRepository extends PagingAndSortingRepository<City, Integer>, JpaSpecificationExecutor<City> { 

} 

あなたが見ることができるように、私はリポジトリに何かを実装する必要はありません

これは

@Service 
@Transactional 
public class CityService { 

    @Autowired 
    private CityRepository cityRepository; 

    @Transactional(readOnly = true) 
    public CityListVO findByNameLike(String name, PageRequest pageRequest) { 
     name = "%" + name + "%"; 

     if (pageRequest == null) { 
      List<City> result = cityRepository.findAll(fillGridCriteria(name)); 
      return new CityListVO(1, result.size(), result); 
     } else { 
      Page<City> result = cityRepository. findAll(fillGridCriteria(name), pageRequest); 
      return new CityListVO(result.getTotalPages(), result.getTotalElements(), result.getContent()); 
     } 

    } 

    private static Specification<City> fillGridCriteria(String name) { 
     return new Specification<City>() { 

      @Override 
      public Predicate toPredicate(
        Root<City> root, 
        CriteriaQuery<?> query, 
        CriteriaBuilder builder) { 

      /* 
       The current return I can do a like by name, and it works fine. 

       My problem is if for any reason I need to do multiple joins like the folow jpql: 
       select ci FROM City ci, State st, Country co where ci.st = st AND st.co = co AND co.name = 'Canada'; 

       How to do this from here ? Inside this method. 
       How is gonna be the return for this method ? 

      */ 

       return builder.like(root.get("name"), name.trim()); 
      } 

     }; 
    } 

} 
+0

は、エンティティ間の関係があるのでしょうか? –

答えて

0

は、あなたがしたいとしましょう、私のサービスであり、あなたの国の名前がnameのようなすべての都市で、あなたは関係モデルを持っています:

Country(Long id, String name, String iso) 
State(Long id,Long country, String name, String iso) 
City(Long id, Long state, String name, String iso) 

述語:

private static Specification<City> fillGridCriteria(String name) { 
    return new Specification<City>() { 

     @Override 
     public Predicate toPredicate(
       Root<City> root, 
       CriteriaQuery<?> query, 
       CriteriaBuilder builder) { 

      return 
      builder.like(root.get("state").get("country").get("name"), name.trim()); 
     } 

    }; 
} 
+0

@GlauterLemos '@ ManyToMany'や' @ OneToMany'に参加したい場合は、 'root.join'を使うことができます。仕様は非常に冗長です。もしあなたが私の場合、querydslを使うのははるか簡単で冗長です:) –

+0

私はRafikに同意します、私はこれについて心配していますhttp://docs.spring.io/spring-data/jdbc/docs/current/reference/html/core.querydsl.html –

関連する問題