2017-11-16 1 views
1

私は、criteriaQueryにゲッターを使用しようとしています。CriteriaBuilderクエリでgetterを使用

私は翻訳クラスとテーマクラスを持っています。私は変換キーではなく、変換された値でテーマを検索したい。

は、ここに私のコードです:

@Entity 
public class Translation implements Serializable{ 
    private static final long serialVersionUID = -6216704909713037946L; 
    static final String DEFAULT_LOCALE = "EN"; 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    @NaturalId 
    private String code; 

    private String locale; 

    private String value; 

    public Translation() {} 

    public String getCode() { 
     return code; 
    } 

    public void setCode(String code) { 
     this.code = code; 
    } 

    public String getLocale() { 
     return locale; 
    } 

    public void setLocale(String locale) { 
     this.locale = locale; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

    public static String geTranslatedValue(Map<String, Translation> translations) { 
     if(translations.containsKey(LocaleContextHolder.getLocale().getCountry())) 
      return translations.get(LocaleContextHolder.getLocale().getCountry()).getValue(); 
     else if(translations.containsKey(Translation.DEFAULT_LOCALE)) 
      return translations.get(Translation.DEFAULT_LOCALE).getValue(); 
     return null; 
    } 
} 


@Entity 
@Access(AccessType.PROPERTY) 
public class Theme implements Serializable{ 
    private Map<String, Translation> names; 

    private String name; 

    public Theme() { 
     this.names = new HashMap<>(); 
    } 

    @JoinColumn(name = "code", referencedColumnName = "name") 
    @OneToMany(fetch = FetchType.EAGER) 
    @MapKey(name = "locale") 
    @JsonIgnore 
    public Map<String, Translation> getNames() { 
     return names; 
    } 

    public void setNames(Map<String, Translation> names) { 
     this.names = names; 
    } 

    @Column(name="name") 
    public String getName() { 
     return Translation.geTranslatedValue(this.names); 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 
} 

そして、私のダオに私は名前で私のテーマを取得しよう。

criteriaList.add(builder.like(themeRoot.get("name"), "%val%")); 

しかし、比較には名前を使用していない、それも@Access(AccessType.PROPERTY)を使用して翻訳のコードを使用しています。

どうすれば解決できますか?

答えて

0

あなたは今

builder.like(themRoot.get(Theme_.name), val); 

ここで、2.4節を参照以下のように生成されたJPAメタモデルクラスを使用することができ、あなたの依存関係に下回っ

<dependency> 
    <groupId>org.hibernate</groupId> 
    <artifactId>hibernate-jpamodelgen</artifactId> 
</dependency> 

を追加することにより、JPAメタモデルを使用することができます。 https://docs.spring.io/spring-data/jpa

関連する問題