2011-01-11 30 views
0

假設我有以下SQL語句。我想將其轉換爲扭矩標準:Apache Torque條件:如何加入子查詢

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

基本上,我不認爲扭矩標準適合這種類型的查詢。 首先你要選擇特定的欄目。標準通常用於爲查詢表選擇扭矩對象。儘管您可以使用村莊記錄選擇特定的列,所以實際上可以使用標準來選擇自定義列,但是很麻煩*。 其次,也是最重要的一點,我不相信左連接是可能的。標準設置爲基本上使用JOIN作爲子查詢AFAIK。

使用基本標準的樣本子查詢 「加入」 將是

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列= someValue中和表中的列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); 
    } 
} 
+0

http://www.jajakarta.org/turbine/jp/turbine/torque/criteria-howto.html – 2011-01-12 00:31:35

+0

http://www.jajakarta.org/turbine/jp/turbine/ torque/peers-howto.html檢查這兩個鏈接了一些有用的指針。 – 2011-01-12 00:32:15

0

在數據庫中創建一個實現複雜查詢的新視圖,然後在您的應用程序中輕鬆查詢只讀的Torque OM類。

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 ..