【问题标题】:Use getter in CriteriaBuilder query在 CriteriaBuilder 查询中使用 getter
【发布时间】:2018-04-30 14:15:24
【问题描述】:

我正在尝试在条件查询中使用 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)

我该如何解决?

【问题讨论】:

    标签: java sql hibernate jakarta-ee


    【解决方案1】:

    您可以通过将以下添加到您的依赖项来使用 jpa 元模型

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

    您现在可以使用生成的 jpa 元模型类,如下所示

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

    请参阅此处的第 2.4 节: https://docs.spring.io/spring-data/jpa

    【讨论】:

      猜你喜欢
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 2021-11-07
      相关资源
      最近更新 更多