0

次のSQLステートメントがあるとしましょう。これをトルク基準に変換したいと思います。

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)

サブクエリ自体は重要ではありません。ここでの唯一の問題は、その左結合を実行する方法です。

4

4 に答える 4

2

基本的に、トルク基準はこのタイプのクエリには適していないと思います。まず、特定の列を選択します。基準は通常、クエリされたテーブルのトルクオブジェクトを選択するために使用されます。ただし、村のレコードを使用して特定の列を選択できるため、基準を使用してカスタム列を選択することは実際には可能ですが、面倒です*。第二に、そして最も重要なことは、私は左の参加が可能であるとは思わない。基準は、基本的にサブクエリAFAIKとしてJOINを使用するように設定されています。

基本的な基準「結合」を使用したサンプルサブクエリは次のようになります。

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

これにより、テーブルAからエントリが選択されます。テーブルBの列a = somevalueであり、テーブルaの列b=テーブルbの列bです。

全体として、過度に複雑な基準については直接クエリをお勧めします。

public static List<Object> doDynamicQuery(String dynamicQuery){
  Connection connection = null;
  try{
   connection = Torque.getConnection(Torque.getDefaultDB());
   connection.setReadOnly(true);
   PreparedStatement statement = connection.prepareStatement(dynamicQuery);
   ResultSet set = statement.executeQuery();
   QueryDataSet dataSet = new QueryDataSet(set);
   return BasePeer.getSelectResults(dataSet);
  }
  catch(Exception e){
   log.error(e);
   return null;
  }
  finally{
   Torque.closeConnection(connection);
  }
 }
于 2011-01-12T00:25:44.617 に答える
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);

つまり、アイデアは次のとおりです。すべての基準はサブクエリです。そして、あなたは「または」または「そして」または何でも置くことができ、そして最後に、基準を主要な基準と結合します。

于 2011-01-14T18:27:12.267 に答える
0

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

于 2011-05-03T16:36:10.503 に答える
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)

Torqueの自動マッピングメカニズムを使用します。ObjectListMapperも存在します。

于 2014-06-06T13:28:08.320 に答える