2012-07-09 192 views
0

我有下一個表:休眠標準問題

Table table1 
table1Id 
field1 
field2 
field3 

Table table2 
table2Id 
table2_field1 
table2_field2 
table2_field3 
table1Id 

在這個方法我從表1的對象有些外地

public List<table1> getMost() { 

     DetachedCriteria criteria = (DetachedCriteria) DetachedCriteria.forClass(table1.class); 
     //criteria.add(Restrictions.conjunction()); 
     criteria.addOrder(Order.desc("field1")); 

     List<table1> myList = (List<table1>) findByCriteria(criteria, 
       false, 0, 10);//get first 10 elements by some criteria 
     return myList; 
    } 

然後我需要從數據庫中獲得一些字段排序對象排序,但這些對象取決於表1中的對象

public Item getTheBest(Long table1Id) { 

     DetachedCriteria criteria = (DetachedCriteria) DetachedCriteria 
       .forClass(Item.class); 

     DetachedCriteria maxQuery = DetachedCriteria.forClass(Item.class); 
     maxQuery.add(Restrictions.eq("table1Id", table1Id)).setProjection(
       Projections.max("table2_field1")); 
     criteria.add(Restrictions.and(
       Restrictions.eq("table1Id", table1Id), 
       Property.forName("table2_field1").eq(maxQuery))); 
     List<Item> result = (List<Item>) findByCriteria(criteria, false); 

     if (result.iterator().hasNext()) 
      return result.iterator().next(); 
     else 
      return null; 

    } 

我想要的是這樣的方法:

public Item getTheBest(List<Long> table1Ids) 

因此,這種方法構成了上述兩種方法,並減少了計算量。 該方法的想法是有一個對象的集合,按一個標準排序,並按照這個標準排序後,我們選擇一些字段的項目。 那麼我該如何做到這一點在休眠?

回答

1

我從上面可以理解爲,你有「一個有序的查詢結果,並且要進一步過濾它。」

你可以做到這一點在本機SQL和使用Hibernate來查詢結果轉換爲Java對象。以下是一個例子

SELECT FROM({如果需要GROUP BY} SELECT t1.a,t1.b FROM表1 T1 ORDER BY t1.a)子表,表2 T2 WHERE t1.a = SOMETHING AND t2.x = SOMETHING

+0

@瘋狂怪胎。更確切地說,當我選擇了一些來自第一個表的數據,我想從第二個選擇數據,其中ID是相等的,並且不能有超過1個具有table1id值的代表實例 – 2012-07-10 12:58:19