2013-04-05 13 views
6

Bir varlıkta birden çok Hazırda Bekleme filtresi olmasını istiyorum, her şeyi mantıklı bir şekilde denemedim ve Google, bu hazırda beklemede olan bir belgede olduğu gibi, bu konuda kısa bir süredir. Bunun mümkün olmadığını hayal edemiyorum.Hazırda Bekletme: Bir öğede birden çok filtre var

@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; 

... 
} 

Ben Testcase sınıfına ikinci bağımsız filtre eklemek istiyorum:

Şu anda, bu var (Java 6 hazırda 4.1.9.final kullanma).

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

Bu benim

Böyle böyle TestCase için birden @FilterDefs ekleyerek çalıştı çalıştı budur, ama bu derleme vermedi: Sonra ben böyle bir şeydir

@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; 

    ... 
    } 

hazırda dokümantasyon testrunid filtresi şikâyet etmişler böyle bir şey denemek için yol açtı varolmayan

@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; 

.. 
} 

Yardımınız için çok teşekkür ederiz.

+5

+1 ihtiyaç olanları açın. kullanıcı denediğini gönderdi. – dcernahoschi

cevap

11

Bunu gerçekten çözdüm ama yardımın için teşekkürler. Çözüm (aşağıda ayrıntılı olarak açıklanmıştır), bir @FilterDef s ek açıklamasında birden çok @FilterDef ek açıklamalarının sarılmasıdır. Garip bir şekilde bu bir yerde ya da Hibernate dokümanı bulamadım, bu yazıyı gördüm (Multiple annotations of the same type on one element?), ve hey maybee @FilterDefs var ve var. DAO

@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; 

... 
} 

, ben sadece

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; 
    } 
+1

+1. Hazırda bekleyen referansta bir referans var: http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html/ch19.html#objectstate-filters Onu da özledim. – dcernahoschi

İlgili konular