私は、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());
}
};
}
}
は、エンティティ間の関係があるのでしょうか? –