java - Hibernate: Multiple filters on an entity -
i want have multiple hibernate filters on entity, have tried logical without luck , google has come short on one, has hibernate doc. can't imagine not possible. (using java 6 hibernate 4.1.9.final)
currently, 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 add second independent filter testcase class. after this:
select ... category inner join testcase on category.categoryid = testcase.categoryid testcase.testrunid in (....) , testcase.testcasename '%..%' this tried
i tried adding multiple @filterdefs testcase such, 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 :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 try complained testrunid filter 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 :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 (left) outer join default. * bit of hql required inner join. * query tells hibernate inner join on testcases property inside category object */ query query = session.createquery("select distinct c category c inner join c.testcases tc"); list<category> result = query.list(); return result; .. } your appreciated
i've solved actually, help. solution (detailed below) wrap multiple @filterdef annotations in @filterdefs annotation. oddly enough didn't find anywhere or in hibernate doc, saw post (multiple annotations of same type on 1 element?), , thought hey maybee @filterdefs exists , does.
@entity @table(name = "testcase_new") @filterdefs({ @filterdef(name = "testcase_name_filter", defaultcondition = "testcasename :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 dao, turn on ones 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 (left) outer join default. * bit of hql required inner join. * query tells hibernate inner join on testcases property inside category object */ query query = session.createquery("select distinct c category c inner join c.testcases tc"); list<category> result = query.list(); return result; }
Comments
Post a Comment