在Hibernate中过滤

时间:2013-03-19 00:31:56

标签: hibernate filter annotations one-to-many

我有一个非常简单的一对多关系,并希望使用in子句过滤多边(集合)。我无法让过滤器工作。 Hibernate抱怨过滤器参数是未定义的(当使用Set或Integer作为类型时)或者它表示传入的值是错误的类型(当使用int参数类型时)

关系:类别有很多测试用例,测试用例只有一个类别

POJO的#1

@Entity
@Table(name = "CATEGORY")
public class Category
{
    @Id
    @Column(name = "CATEGORYID")
    private int ID;

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

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

Pojo#2

@Entity
@Table(name = "TESTCASE_NEW")
@FilterDef(name = "TEST_RUN_ID_FILTER", defaultCondition = "TESTRUNID in (:IDS)", parameters = { @ParamDef(name = "IDS", type = "Integer") })
public class SimpleTestCase
{
    @Id
    @Column(name = "TESTCASEID")
    private int ID;

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

    @Column(name = "STATUS")
    private String status;

    @Column(name = "TESTRUNID")
    private int testRunId;
}

DAO

public List<Category> getAllCategoriesForTestRuns(Set<Integer> testRunIDs)
{
    Session session = getSession();
    session.enableFilter("TEST_RUN_ID_FILTER")
            .setParameter("IDS", testRunIDs);
    Query query = session.createQuery("FROM " + Category.class.getSimpleName());
    List<Category> result = query.list();
    return result;
}

异常(当Set或Integer为param类型时):

Java.lang.IllegalArgumentException: Undefined filter parameter [IDS]
at org.hibernate.impl.FilterImpl.setParameter(FilterImpl.java:74)

异常(当int是param类型时)

java.lang.IllegalArgumentException: Incorrect type for parameter [IDS]
    at org.hibernate.impl.FilterImpl.setParameter(FilterImpl.java:77)

1 个答案:

答案 0 :(得分:8)

FilterImpl.setParameter只能处理奇异参数。

当涉及传递集合或数组参数时,

使用FilterImpl.setParameterList(name, values)

https://forum.hibernate.org/viewtopic.php?p=2410099