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

基本上,我认为扭矩标准不适合这种类型的查询。首先,您要选择特定的列。Criteria 通常用于为查询表选择扭矩对象。您可以使用村庄记录选择特定列,因此实际上可以使用标准选择自定义列,但很麻烦*。其次,也是最重要的,我不相信左连接是可能的。标准设置为基本上将 JOIN 用作子查询 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 = 某个值,表 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

您可以通过明确定义映射器和选定的列来做到这一点:

考虑

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 回答
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

在实现复杂查询的数据库中创建一个新视图,然后创建一个只读 Torque OM 类,您可以从应用程序中轻松查询。

于 2011-05-03T16:36:10.503 回答