Hibernate:实体上的多个过滤器 [英] Hibernate: Multiple filters on an entity

查看:98
本文介绍了Hibernate:实体上的多个过滤器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望在一个实体上有多个Hibernate过滤器,我已经尝试过所有合乎逻辑的事情,但没有幸运,而且谷歌已经在这篇文章中做了简短的介绍,就像Hibernate doc一样。我无法想象这是不可能的。 (使用Java 6 Hibernate 4.1.9.final)



目前,我拥有这个:

  @Entity 
@Table(name =CATEGORY)
public class Category implements Serializable
{
private static final long serialVersionUID = 1L;

@Id
@Column(name =CATEGORYID)
private int ID;

@Column(name =CATEGORYNAME)
私人字符串名称;
$ b @OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name =CATEGORYID)
@OrderBy(TESTCASEID desc)
@Filter(name =TEST_RUN_ID_FILTER)
私人收藏< TestCase>测试用例;
...
}

@Entity
@Table(name =TESTCASE_NEW)
@FilterDef(name =TEST_RUN_ID_FILTER,defaultCondition = TESTRUNID in(:IDS),parameters = {@ParamDef(name =IDS,type =int)})
public class TestCase implements Serializable
{
private static final long serialVersionUID = 1L;

@Id
@Column(name =TESTCASEID)
private int ID;

@Column(name =TESTCASENAME)
私人字符串名称;

...
}

我想添加一个第二个独立的过滤器到Testcase类。

 选择... 
从CATEGORY.CATEGORYID的CATEGORY INNER JOIN TESTCASE中= TESTCASE.CATEGORYID
(....)
和TESTCASE.TESTCASENAME中的TESTCASE.TESTRUNID,如'%..%'

这是我尝试的



我试着向TestCase添加多个@FilterDefs, ,但没有编译:

  @Entity 
@Table(name =TESTCASE_NEW)
@FilterDef(name =TEST_RUN_ID_FILTER,defaultCondition =TESTRUNID in(:IDS),
parameters = {@ParamDef(name =IDS,type =int)})
@ FilterDef(name =TESTCASE_NAME_FILTER,defaultCondition =TESTCASENAME like:TESTCASE_NAME,
parameters = {@ParamDef(name =TESTCASE_NAME,type =string)})

public类TestCase实现Serializable
{
private static final long serialVersionUID = 1L;

@Id
@Column(name =TESTCASEID)
private int ID;

@Column(name =TESTCASENAME)
私人字符串名称;

...
}

Hibernate文档导致尝试像这样抱怨testrunid过滤器不存在的东西

  @Entity 
@Table(name = CATEGORY)
public class Category implements Serializable
{
private static final long serialVersionUID = 1L;

@Id
@Column(name =CATEGORYID)
private int ID;

@Column(name =CATEGORYNAME)
私人字符串名称;

@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name =CATEGORYID)
@OrderBy(TESTCASEID desc)
私人收藏< TestCase> ;测试用例;
...
}


@Entity
@Table(name =TESTCASE_NEW)
@FilterDef(name =TESTCASE_FILTER ,参数= {@ParamDef(name =IDS,type =int),@ParamDef(name =TESTCASE_NAME,type =string)})
@Filters({@Filter = TEST_RUN_ID_FILTER 条件= 在TESTRUNID(:IDS)),@Filter(名称= TESTCASE_NAME_FILTER 条件= TESTCASENAME像:TESTCASE_NAME)})
// @FilterDef(名称=TEST_RUN_ID_FILTER ,defaultCondition =TESTRUNID in(:IDS),parameters = {@ParamDef(name =
//IDS,type =int)})
public class TestCase implements Serializable
{
private static final long serialVersionUID = 1L;

@Id
@Column(name =TESTCASEID)
private int ID;

@Column(name =TESTCASENAME)
私人字符串名称;
...
}
@SuppressWarnings(unchecked)
public List< Category> getCategories(List< Integer> testRunIDs,String category,String testCaseName)
{
Session session = getSession();
session.enableFilter(FILE_TYPE_FILTER);
if(testRunIDs!= null&& testRunIDs.size()!= 0)
{
session.enableFilter(TEST_RUN_ID_FILTER)。setParameterList(IDS,testRunIDs);

if(category!= null&&!category.equals(0)&!category.equals())
{
session.enableFilter(CATEGORY_FILTER)。setParameter(CATEGORY,category);
}

/ *
* Hibernate希望将一个(左)外连接设为默认值。
* HQL的这一点是需要让它做一个内部连接。
*查询告诉Hibernate在Category对象内的testCases属性上执行内部连接
* /

Query query = session.createQuery(select c from Category c内部连接c.testCases tc);
列表<类别> result = query.list();
返回结果;



code
$ b

您的帮助非常感谢

解决方案

我已经解决了它,但感谢您的帮助。解决方案(下面详述)是在@FilterDef s 注释中包装多个@FilterDef注释。奇怪的是,我没有发现这个地方或在Hibernate文档中,我看到这篇文章(在一个元素上多个相同类型的注释?),并且认为hey maye @FilterDefs存在并且它确实存在。

  @Entity 
@Table(name =TESTCASE_NEW)
@FilterDefs({
@FilterDef(name =TESTCASE_NAME_FILTER,defaultCondition =TESTCASENAME like:TESTCASENAME,parameters = {@ParamDef(name =TESTCASENAME,type =string)}),
@FilterDef(name = TEST_RUN_ID_FILTER,defaultCondition =TESTRUNID in(:IDS),parameters = {@ParamDef(name =IDS,type =int)})
))
public class TestCase implements Serializable
{
private static final long serialVersionUID = 1L;

@Id
@Column(name =TESTCASEID)
private int ID;

@Column(name =TESTCASENAME)
私人字符串名称;

...
}

@Entity
public class Category implements Serializable
{
private static final long serialVersionUID = 1L;

@Id
@Column(name =CATEGORYID)
private int ID;

@Column(name =CATEGORYNAME)
私人字符串名称;
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name =CATEGORYID)
@OrderBy(TESTCASEID desc)
@Filters({
@Filter(name =TEST_RUN_ID_FILTER),
@Filter(name =TESTCASE_NAME_FILTER)})
private Collection< TestCase>测试用例;

...
}

在DAO中,我只需打开我需要的那些

  public List< Category> getCategories(List< Integer> testRunIDs,String category,String testCaseName)
{
Session session = getSession();


if(testRunIDs!= null&&&& testRunIDs.size()!= 0)
{
session.enableFilter(TEST_RUN_ID_FILTER)。setParameterList (IDS,testRunIDs);

$ b $ if(testCaseName!= null)
{
session.enableFilter(TESTCASE_NAME_FILTER)。setParameter(TESTCASENAME,testCaseName);
}

/ *
* Hibernate希望将一个(左)外连接设为默认值。
* HQL的这一点是需要让它做一个内部连接。
*查询告诉Hibernate在Category对象内的testCases属性上执行内部连接
* /

Query query = session.createQuery(select c from Category c内部连接c.testCases tc);
列表<类别> result = query.list();
返回结果;
}


I want to have multiple Hibernate filters on an entity, I have tried everything logical without luck and Google has come up short on this one, as has the Hibernate doc. I can't imagine that this is not possible. (Using Java 6 Hibernate 4.1.9.final)

Currently, I have this:

@Entity
@Table(name = "CATEGORY")
public class Category implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "CATEGORYID")
    private int ID;

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

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "CATEGORYID")
    @OrderBy("TESTCASEID desc")
    @Filter(name = "TEST_RUN_ID_FILTER")
    private Collection<TestCase> testCases;
...
}

@Entity
@Table(name = "TESTCASE_NEW")
@FilterDef(name = "TEST_RUN_ID_FILTER", defaultCondition = "TESTRUNID in (:IDS)", parameters = { @ParamDef(name = "IDS", type = "int") })
public class TestCase implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "TESTCASEID")
    private int ID;

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

...
}

I want to add a second independent filter to the Testcase class. What I am after is something like this:

Select ...  
  From CATEGORY INNER JOIN TESTCASE on CATEGORY.CATEGORYID = TESTCASE.CATEGORYID
 Where TESTCASE.TESTRUNID in (....)
   and TESTCASE.TESTCASENAME like '%..%'

This is what I tried

I tried adding multiple @FilterDefs to TestCase like such, but that didn't compile:

    @Entity
    @Table(name = "TESTCASE_NEW")
    @FilterDef(name = "TEST_RUN_ID_FILTER", defaultCondition = "TESTRUNID in (:IDS)", 
parameters = { @ParamDef(name = "IDS", type = "int") })
    @FilterDef(name = "TESTCASE_NAME_FILTER", defaultCondition = "TESTCASENAME like :TESTCASE_NAME", 
parameters = { @ParamDef(name = "TESTCASE_NAME", type = "string") })

    public class TestCase implements Serializable
    {
        private static final long serialVersionUID = 1L;

        @Id
        @Column(name = "TESTCASEID")
        private int ID;

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

    ...
    }

The Hibernate documentation led to to try something like this which complained the testrunid filter was non-existent

    @Entity
    @Table(name = "CATEGORY")
    public class Category implements Serializable
    {
        private static final long serialVersionUID = 1L;

        @Id
        @Column(name = "CATEGORYID")
        private int ID;

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

        @OneToMany(fetch = FetchType.EAGER)
        @JoinColumn(name = "CATEGORYID")
        @OrderBy("TESTCASEID desc")
        private Collection<TestCase> testCases;
    ...
    }


       @Entity
    @Table(name = "TESTCASE_NEW")
    @FilterDef(name = "TESTCASE_FILTER", parameters = { @ParamDef(name = "IDS", type = "int"), @ParamDef(name = "TESTCASE_NAME", type = "string") })
    @Filters({ @Filter(name = "TEST_RUN_ID_FILTER", condition = "TESTRUNID in (:IDS)"), @Filter(name = "TESTCASE_NAME_FILTER", condition = "TESTCASENAME like :TESTCASE_NAME") })
    // @FilterDef(name = "TEST_RUN_ID_FILTER", defaultCondition = "TESTRUNID in (:IDS)", parameters = { @ParamDef(name =
    // "IDS", type = "int") })
    public class TestCase implements Serializable
    {
        private static final long serialVersionUID = 1L;

        @Id
        @Column(name = "TESTCASEID")
        private int ID;

        @Column(name = "TESTCASENAME")
        private String name;
        ...
    }
     @SuppressWarnings("unchecked")
        public List<Category> getCategories(List<Integer> testRunIDs, String category, String testCaseName)
        {
            Session session = getSession();
            session.enableFilter("FILE_TYPE_FILTER");
            if (testRunIDs != null && testRunIDs.size() != 0)
            {
                session.enableFilter("TEST_RUN_ID_FILTER").setParameterList("IDS", testRunIDs);
            }
            if (category != null && !category.equals("0") && !category.equals(""))
            {
                session.enableFilter("CATEGORY_FILTER").setParameter("CATEGORY", category);
            }

            /*
             * Hibernate wants to do an (left) outer join be default.
             * This bit of HQL is required to get it to do an inner join.
             * The query tells Hibernate to do an inner join on the testCases property inside the Category object
             */

            Query query = session.createQuery("select distinct c from Category c inner join c.testCases tc");
            List<Category> result = query.list();
            return result;

..
}

Your help is greatly appreciated

解决方案

I've solved it actually, but thanks for the help. The solution (detailed below) is to wrap multiple @FilterDef annotations in a @FilterDefs annotation. Oddly enough I didn't find this anywhere or in the Hibernate doc, I saw this post (Multiple annotations of the same type on one element?), and thought hey maybee @FilterDefs exists and it does.

@Entity
@Table(name = "TESTCASE_NEW")
@FilterDefs({
        @FilterDef(name = "TESTCASE_NAME_FILTER", defaultCondition = "TESTCASENAME like :TESTCASENAME", parameters = { @ParamDef(name = "TESTCASENAME", type = "string") }),
        @FilterDef(name = "TEST_RUN_ID_FILTER", defaultCondition = "TESTRUNID in (:IDS)", parameters = { @ParamDef(name = "IDS", type = "int") })
})
public class TestCase implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "TESTCASEID")
    private int ID;

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

...
}

@Entity
public class Category implements Serializable
{
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "CATEGORYID")
    private int ID;

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

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "CATEGORYID")
    @OrderBy("TESTCASEID desc")
    @Filters({
            @Filter(name = "TEST_RUN_ID_FILTER"),
            @Filter(name = "TESTCASE_NAME_FILTER") })
    private Collection<TestCase> testCases;

...
}

In the DAO, I just turn on the ones I need

public List<Category> getCategories(List<Integer> testRunIDs, String category, String testCaseName)
    {
        Session session = getSession();


        if (testRunIDs != null && testRunIDs.size() != 0)
        {
            session.enableFilter("TEST_RUN_ID_FILTER").setParameterList("IDS", testRunIDs);
        }

        if (testCaseName != null)
        {
            session.enableFilter("TESTCASE_NAME_FILTER").setParameter("TESTCASENAME", testCaseName);
        }

        /*
         * Hibernate wants to do an (left) outer join be default.
         * This bit of HQL is required to get it to do an inner join.
         * The query tells Hibernate to do an inner join on the testCases property inside the Category object
         */

        Query query = session.createQuery("select distinct c from Category c inner join c.testCases tc");
        List<Category> result = query.list();
        return result;
    }

这篇关于Hibernate:实体上的多个过滤器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆