当前位置: 首页 > 面试题库 >

Hibernate:实体上的多个过滤器

公良玺
2023-03-14
问题内容

我想在一个实体上使用多个Hibernate过滤器,我尝试了所有没有失败的逻辑,Google以及Hibernate文档都对此提出了不足。我无法想象这是不可能的。(使用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")
    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;

...
}

我想向Testcase类添加第二个独立过滤器。我所追求的是这样的:

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

这是我尝试过的

我试图像这样向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 class TestCase implements Serializable
    {
        private static final long serialVersionUID = 1L;

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

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

    ...
    }

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")
        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;

..
}

非常感谢您的帮助


问题答案:

我实际上已经解决了,但感谢您的帮助。解决方案(下面详细介绍)是将多个@FilterDef批注包装在@FilterDef 批注中。奇怪的是,我没有在任何地方或Hibernate文档中找到它,我看到了这篇文章在一个元素上具有相同类型的多个注释?并认为可能@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")
    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;

...
}

在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);
        }

        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——一个包含多个实体的表?。 然而,我希望将两个实体映射到同一个表,但我希望它们都是实体,我可以从中选择。我的意思是: 一个表:人(id、姓名、出生日期、城市、街道、邮政编码)。 两个实体:人(id、name、dateOfBirth)、地址(id、城市、街道、邮政编码)。 实体之间是1:1的关系,但数据库中仍然是1个表。 如果我在上面的链接中使用建议的解决方案(

  • 我试图理解Hibernate过滤器,我认为即使查询不是从过滤的实体开始,也可以应用过滤器,如果我只是加入它。 我的实体: 过滤器通过拦截器启用,为了安全起见,从数据库中获取参数列表。 当我执行这样的查询时: 过滤器被应用了。但是我也希望当我的查询从模块部分开始时应用过滤器: 在上述查询中,没有应用筛选器。 ModuleSect实体中的学术类为null,但我也有其他实体不为空,其中上述情况不起作用。

  • 我想要找到合适的正则表达式匹配的行数。输入是通过Java Stream插入的日志文件。我想对这个流应用多个过滤器,但每隔一段时间计算一次。

  • 当我映射同一个实体时,就像这里回答的那样: Hibernate与同一实体的多对多关联 在“tbl_friends”表中,我有相同含义的行。例如,我有id=1的用户和id=2的用户。在“tbl_friends”表中,当他们作为朋友链接时,我有两行 使用Hibernate或JPA引用是否可以在一行(1-2或2-1)中建立这种关系?

  • 问题内容: 我正在建立一个显示api数据的项目,现在我需要对其进行过滤。 我已经完成了类别过滤器,现在我必须做一个价格范围过滤器,以便这两个过滤器可以一起工作,但是我在努力正确地做到这一点。对于价格范围过滤器,我使用2个输入和一个Submit按钮。 我得到了一系列对象,看起来像这样; 我有状态: 如果我的弯管机状态已更改,则设置状态的功能另外,对于开始状态和结束状态,也有类似的功能当我为价格设置状

  • 问题内容: 我可以为一个实体使用多个序列生成器吗? 问题答案: 你不能。该生成器仅适用于标识符列。 确保使用脚本(例如)创建此序列: 然后使用如下映射: