2017-11-28 16 views
0

私が持っている単語とvocabmlの間には多くの関連する1、(説明の条件に基づいて、2つのテーブルと結合フィルタを)単純なクエリで行われるために必要なもの追加どこJPA基準のAPIとの結合テーブルのための句

基準のAPIと
select * from vocab v 
left join vocabml vm on vm.vocabid = v.id and vm.locale in ('uk','en'....) 
where v.description like '%syst%' 
or vm.description like '%syst%' 

私の試みは、例外が発生します:Caused by: java.lang.IllegalStateException: Illegal attempt to dereference path source [null.vocabmls] of basic type

マイコード:

CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Vocab> criteriaQuery = builder.createQuery(Vocab.class); 
criteriaQuery.distinct(true); 

Root<Vocab> root = criteriaQuery.from(Vocab.class); 
root.fetch("vocabmls", JoinType.LEFT); 

List<Predicate> predicates = = new ArrayList<>(); 


Predicate predicate = builder.or(builder.like(root.get("description"), "%" + description + "%"), 
         builder.like(root.get("vocabmls").get("description"), "%" + description + "%")); 
predicates.add(predicate) 

if(locales != null){ 
    List<String> ids = locales.stream().map(Locale::getId).collect(Collectors.toList()); 
    Join<Vocab, Vocabml> vocabmlJoin = root.join("vocabmls", JoinType.LEFT); 
    vocabmlJoin.on(builder.and(vocabmlJoin.<Vocabml> get("localeId").in(ids))); 
} 

criteriaQuery.where(predicates.toArray(new Predicate[] {})).orderBy(builder.asc(root.get("description"))); 
return entityManager.createQuery(criteriaQuery).getResultList(); 
+0

は、あなたがコピーできます

Predicate predicateJoin = builder.equal(vocabmlJoin.get("description"), description); predicates.add(predicateJoin); 

に参加使用して条件を追加する必要があり、このようにそれを解決完全なスタックトレース、例外をスローする行を確認する –

+0

この行が好きではありませんroot.get( "vocabmls")。get( "description") – Sergey

答えて

0

私はそれが簡単なアドオンwhere vm.description =

はまた、私はあることを、このいずれかを変更したりせず、

criteriaQuery.where(builder.or(predicates.toArray(new Predicate[] {}))) 
関連する問題