2016-07-24 3 views
0

同様の方法でジョイントでジョインを使用できるようにするには、回避策が必要です。 criteriaBuilderはequalメソッドとの結合をサポートしますが、likeメソッドとの結合はサポートしません。これらの場合、回避策はありますか?likeを使用してcriteriaBuilderに参加できません。等しいだけで動作します

public Predicate toPredicate(Root<T> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { 
    switch (criteria.getOperation()) { 
     case ":": 
      String[] s = criteria.getKey().split("\\."); 
      if (s.length == 1) { 
       if (root.get(criteria.getKey()).getJavaType() == String.class) { 
        return criteriaBuilder.like(criteriaBuilder.upper(
          root.<String>get(criteria.getKey())), "%" + criteria.getValue().toString().toUpperCase() + "%"); 
       } else if (root.get(criteria.getKey()).getJavaType() == Date.class) { 
        try { 
         DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
         return criteriaBuilder.greaterThanOrEqualTo(root.<java.util.Date>get(criteria.getKey()), formatter.parse(criteria.getValue().toString())); 
        } catch (ParseException e) { 
        } 
       } else { 
        return criteriaBuilder.equal(root.get(criteria.getKey()), criteria.getValue()); 
       } 
      } else { 
       //I need a "like" here 
       return criteriaBuilder.equal(root.join(s[0]).get(s[1]), criteria.getValue()); 
      } 
     default: 
      return null; 
    } 
} 

です。

+0

なぜ「like」が機能しないと思いますか? – ujulu

+0

@ujulu "like"は(引数の点で)joinをサポートしていません。 –

答えて

0

私はそれを動作させました。私は、結合のように使うための正しい構文構造を管理しました。 likeを使用する場合、最初にStringを指定する必要があります。その前に.get put .<String>get

public Predicate toPredicate(Root<T> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { 
switch (criteria.getOperation()) { 
    case ":": 
     String[] s = criteria.getKey().split("\\."); 
     if (s.length == 1) { 
      if (root.get(criteria.getKey()).getJavaType() == String.class) { 
       return criteriaBuilder.like(criteriaBuilder.upper(
         root.<String>get(criteria.getKey())), "%" + criteria.getValue().toString().toUpperCase() + "%"); 
      } else if (root.get(criteria.getKey()).getJavaType() == Date.class) { 
       try { 
        DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 
        return criteriaBuilder.greaterThanOrEqualTo(root.<java.util.Date>get(criteria.getKey()), formatter.parse(criteria.getValue().toString())); 
       } catch (ParseException e) { 
       } 
      } else { 
       return criteriaBuilder.equal(root.get(criteria.getKey()), criteria.getValue()); 
      } 
     } else { 
      //I need a "like" here 
      return criteriaBuilder.like(criteriaBuilder.upper(root.join(s[0]).join(s[1]).<String>get(s[2])),"%" + criteria.getValue().toString().toUpperCase() + "%"); 
     } 
    default: 
     return null; 
} 
} 
関連する問題