Hibernate过滤器无法正常工作

时间:2015-05-22 08:48:23

标签: java hibernate jpa filter

我有两个用OneToOne映射的实体,定义如下:

分类

@Entity
@Table(name = "category")
@FilterDef(name = "currentLang", parameters = {
    @ParamDef(name = "lang", type = "string")
})
public class Category implements Serializable {

    @Id
    @NotNull
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private int id;

    @Column(name = "dt")
    private String dt;

    @Column(name = "enable", length = 5)
    private String enable;

    @OneToOne()
    @Filter(name = "currentLang", condition = ":lang = lang")
    @JoinColumn(name = "context_id", nullable = false, updatable = false, referencedColumnName = "link")
    private Context context;

    public int getId() {
        return id;//test
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getDt() {
        return dt;
    }

    public void setDt(String dt) {
        this.dt = dt;
    }

    public String getEnable() {
        return enable;
    }

    public void setEnable(String enable) {
        this.enable = enable;
    }

    public Context getContext() {
        return context;
    }

    public void setContext(Context context) {
        this.context = context;
    }

    public Category() {
    }

    public Category(String dt, String enable) {
        this.dt = dt;
        this.enable = enable;
    }
}

上下文

@Entity
@Table(name = "context")
@Component
@Scope("session")
public class Context implements Serializable {

    @Id
    @NotNull
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private int id;

    @Column(name = "text")
    private String text;

    @Column(name = "lang")
    private String lang;

    @Column(name = "link")
    private Integer link;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getLang() {
        return lang;
    }

    public void setLang(String lang) {
        this.lang = lang;
    }

    public Context(String text, String lang) {
        this.text = text;
        this.lang = lang;
    }

    public Context() {
    }

    public Integer getLink() {
        return link;
    }

    public void setLink(Integer link) {
        this.link = link;
    }
}

以下代码段检索模型类别。

List<com.blog.blog.entity.Category> categories = categoryService.getAll();
    com.blog.blog.entity.Category category = categories.get(0);

    org.apache.log4j.Logger.getRootLogger().addAppender(new ConsoleAppender(new PatternLayout(PatternLayout.TTCC_CONVERSION_PATTERN)));
    Logger logger = org.slf4j.LoggerFactory.getLogger(this.getClass());
    logger.info(category.getEnable());
    logger.info(category.getContext().getText());

但是过滤器不起作用,结果是错误的,并且在日志中记录了错误的查询。

Info:   Hibernate: select category0_.id as id1_0_, category0_.context_id as context_4_0_, category0_.dt as dt2_0_, category0_.enable as enable3_0_ from category category0_
Info:   Hibernate: select context0_.id as id1_1_0_, context0_.lang as lang2_1_0_, context0_.link as link3_1_0_, context0_.text as text4_1_0_ from context context0_ where context0_.link=?

1 个答案:

答案 0 :(得分:0)

如果需要,您需要启用过滤器和设置参数

Session session = sessionFactory.getCurrentSession();
Filter filter = session.enableFilter("currentLang");
filter.setParameter("lang", getLang());