2011-01-11 18 views
0

次のSQL文があるとします。これをトルク基準に変換したいと思います。Apache Torque Criteria:サブクエリへの参加方法

SELECT table.name, subq1.total AS 'TOTAL', subq2.total2 AS 'SECOND TOTAL' 
FROM table 
LEFT JOIN (
    SELECT c.login, COUNT(*) AS 'total' 
    FROM table2 INNER JOIN table3 
    WHERE table3.field = 2 
    GROUP BY table3.login 
    ) AS subq1 ON(subq1.login = table.login) 
LEFT JOIN(...) AS subq2 ON (subq2.login = table.login) 

サブクエリ自体は関係ありません。ここでの唯一の問題は、LEFT JOINを実行する方法です。

答えて

0

私は分割された方法ですべてのサブクエリを分割してしまいました。 しかし、私はCriterionを使用することもできました。次のようなものがあります。

Criterion criterion = myCriteria.getCriterion(MyTablePeer.STARTINGDATE); 

Criterion c1 = myCriteria.getNewCriterion(criterion.getTable(), 
     criterion.getColumn(), 
     "something", Criteria.LESS_THAN); 
c1.and(myCriteria.getNewCriterion(criterion.getTable(), 
     criterion.getColumn(), 
     someDate, Criteria.GREATER_THAN)); 
criterion.or(c1); 
myCriteria.add(criterion); 

したがって、すべての基準はサブクエリです。 「または」または「と」のいずれかを入れて、最終的に基準を主基準と結びつけることができます。

0

基本的に、トルク基準がこのタイプのクエリに適しているとは思わない。 最初に特定の列を選択しています。基準は、照会テーブルのトルクオブジェクトの選択に一般的に使用されます。あなたは村のレコードを使用して特定の列を選択することができますので、実際には基準を使用してカスタム列を選択することはできますが、面倒です*。 第二に、最も重要なのは、私はLEFT結合が可能であるとは考えていません。条件は、JOINを基本的にサブクエリAFAIKとして使用するように設定されています。基本的な基準を用い

サンプルサブクエリこれは、表A、表Bの列A = someValueの、テーブル列B =表Bの列Bからエントリを選択する

Criteria criteria = new Criteria(); 
criteria.add(TABLEA.COLUMNA,somevalue); 
criteria.add(TABLEB.COLUMNA,somevalue); 
criteria.addJoin(TABLEA.COLUMNB,TABLEB.COLUMNB); 
TABLEA.doSelect(criteria); 

あろう "結合"。

私はちょうど過度に複雑な基準のための直接クエリをお勧めします。

+0

http://www.jajakarta.org/turbine/jp/turbine/torque/criteria-howto.html –

+0

http://www.jajakarta.org/turbine/jp/turbine/ torque/peers-howto.htmlこれらの2つのリンクを参考にして参考にしてください。 –

+0

合意。私も直接クエリを使用します。しかし、これはプロジェクトの要件であり、私は例外を作ることができません(他の方法がない場合のみ)。あなたが言及した特定の列については、申し訳ありませんが、私はその権利を書いていない場合、彼らはトルクオブジェクトです。私は今それを修正するつもりです。基本的な例とリンクについてはありがとうございますが、実際には問題ではありませんでした。左ジョイントはトルクの基準で可能です。ここで実際に問題となるのは、サブクエリの特定の列(上記の例ではsubq1.login)に基づいたサブクエリをジョイン(またはLEFT JOINなど)することです。 – bluefoot

0

複雑なクエリを実装しているデータベースで新しいビューを作成してから、読み取り専用のTorque OMクラスを作成して、アプリケーションから簡単にクエリできます。

+0

それは可能な方法の1つです。しかし、アプリケーションはデータベースに依存し、ビジネスロジックはアプリケーションとデータベースに分割されます。 – bluefoot

0

あなたは明示的に定義するマッパーと、選択した列でそれを行うことができます:

はトルク自動的にマッピングするメカニズムを使用して

crit.addSelectColumn(MyTablePeer.COL1); 
Collections.addAll(crit.getSelectColumns(), MyTable2Peer.getTableMap().getColumns() ); 
crit.addJoin(MyTable2Peer.ID, MyTablePeer.ID2, Criteria.LEFT_JOIN); 
//crit.where(...) 
CompositeMapper cp = new CompositeMapper(); 
cp.addMapper(new IntegerMapper(), 0); // if you expect an int value 
cp.addMapper(new BaseMyTable2RecordMapper(),1); 
List<List<Object>> resultList = MyTable2Peer.doSelect(crit, cp); 
// resultList.get(0).get(1) instanceof MyTable2) 

を考えてみましょう。 ObjectListMapperも存在します。

関連する問題