2012-03-01 40 views
1

我正在嘗試在Java中創建一個支持鏈接/流水線查詢的框架,其中一個查詢的輸出將被轉換爲用作另一個查詢的輸入。類似PyCascading這些查詢將在運行時進行。我查看了一些框架,並發現它們提供鏈接和路由(企業集成模式)的概念。我發現Apache Camel比Spring Integration(IMHO)更好。用Java創建流水線SQL/NOSQL查詢


我應該爲我的框架去Apache Camel,還是有更好的方法可以實現這個目標?

我的查詢語法是

Query query1 = "select customer.id from customer where customer.name = 'ABC'"; 
Query query2 = "select account.id from account where account.custid in {$1}"; 
// $1 will be the input of second query 
from(query1).inputto(query2).printOutput(); 
+0

我會連鎖SQL SQL語句'從帳戶中選擇account.id,客戶在那裏account.custid =客戶。 id和customer.name ='ABC''將數據從數據庫中提取出來只是爲了將它傳回來,這聽起來效率很低。 – 2012-03-01 08:43:51

+0

我同意這將是一個更好的方式,但我的SQL表將在分佈式數據庫,它可能是SQL或NOSQL。所以,查詢對象將負責執行。 – Abhishek 2012-03-01 08:45:09

+0

我會保留所有可能被邏輯連接在一起的數據。如果可能,我只會將不相關的數據放入不同的數據庫中。我會嘗試只有一個或兩個數據庫,它會給你你需要的一切。 – 2012-03-01 08:49:28

回答

1

這是可能的使用camel-jdbc和一些基本的駱駝功能(如simple),讓您內嵌結果解析...

的[ CAMEL-JDBC]結果作爲ArrayList [HashMap [String,Object]]在OUT主體中返回。List對象包含行列表,Map對象包含每個以String鍵作爲列名的行。

那麼這個結果可以用來動態地構造後續查詢...

from("direct:start") 
    .setBody(constant("select customer.id as ID from customer where customer.name = 'ABC'")) 
    .to("jdbc:myDataSource") 

    //now, use simple/ognl to extract the first result and the 'ID' from the Map in the body 
    .setBody(simple("select account.id from account where account.custid in ${body[0][ID]}")) 
    .to("jdbc:myDataSource") 

    .log("ACCOUNT IDS = ${body}"); 
+0

我可以以某種方式傳遞我的對象,而不是依靠setBody()中的toString方法,或者我可以使用Object嗎? – Abhishek 2012-03-02 10:00:58

+0

您可以使用Processor或Bean在路由中執行任何操作...請參閱http://camel.apache.org/processor.html,http://camel.apache.org/bean.html – 2012-03-02 21:12:03