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

次に、いくつかのフィールドでソートされたデータベースからオブジェクトを取得する必要がありますが、これらのオブジェクトはテーブル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)

したがって、この方法は上記の 2 つの方法を組み合わせて、計算量を減らします。メソッドのアイデアは、オブジェクトのコレクションを 1 つの基準でソートし、この基準でソートした後、いくつかのフィールドで項目を選択することです。どうすれば休止状態でそれを行うことができますか?

4

1 に答える 1

1

上記から私が理解したのは、「順序付けされたクエリ結果があり、それをさらにフィルタリングしたい」ということです。

ネイティブ SQL で実行し、hibernate を使用してクエリ結果を Java オブジェクトに変換できます。以下は例です

SELECT FROM (SELECT t1.a, t1.b FROM table1 t1 {必要に応じてグループ化} ORDER BY t1.a) subTable, table2 t2 WHERE t1.a = SOMETHING AND t2.x = SOMETHING

于 2012-07-09T18:26:12.480 に答える