0

我有下一张桌子:

Table table1
table1Id
field1
field2
field3

Table table2
table2Id
table2_field1
table2_field2
table2_field3
table1Id

在这种方法中,我从按某些字段排序的 table1 中获取对象

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

然后我需要从数据库中获取按某个字段排序的对象,但是这些对象依赖于 table1 中的对象

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)

因此该方法由上述两种方法组成,计算量较少。该方法的想法是有一个对象集合,按一个标准排序,在按此标准排序后,我们按某个字段选择项目。那么我怎么能在休眠状态下做到这一点呢?

4

1 回答 1

1

我从上面了解到的是你有一个有序的查询结果,你想进一步过滤它。

您可以在本机 SQL 中执行此操作,并使用 hibernate 将查询结果转换为 java 对象。下面是一个例子

SELECT FROM (SELECT t1.a, t1.b FROM table1 t1 {GROUP BY if needed} ORDER BY t1.a) subTable, table2 t2 WHERE t1.a = Something and t2.x = Something

于 2012-07-09T18:26:12.480 回答