2011-12-10 43 views
0

我有一個項目的想法,我打算編寫一個Java庫,允許使用SQL語法排序和選擇數組。Java SQL風格的數組操作

我的想法是,你可以從陣列這樣的選擇:

int[] nums = new int[] { 0, 5, 7, 2, 4, 9, 3, 1, 6, 8 } 

int result = select().from(nums).where("value > 2").and("value < 8").sort("ASC"); 

這將返回一個新的數組是這樣的:

{ 3, 4, 5, 6, 7 } 

我真的沒有想到很多的實施或這樣做的原因,但我認爲這將是一個非常有趣的嘗試。

我的問題是,這樣的事情是否存在?或者有什麼特別的方法可以解決這個問題?

我也在想,這可能爲Object陣列,在那裏你可以選擇多個字段,這樣有用:

select().from(array).where("Field1 = "+someValue).or("Field1 = "+anotherValue); 

而且可能繼續下去。但我不確定從哪裏開始,或者更好地說明如何開始實施這些方法。

這是一個「要去哪裏」而不是一個答案的問題,所以任何幫助都是有用的。

回答

1

你說得對,我認爲這將是一個有趣的項目。

有很多方法可以用於此。一種方法是依次調用方法創建一個Query對象。

因此,像這樣:

public class Query { 

    public static Query select(String...fields){ 
    //code omitted 
    return query; 
    } 

    public Query from(Collection<Object> collection){ 
    //code omitted 
    return this; 
    } 

    public Query where(String field, Object value){ 
    //code omitted 
    return this; 
    } 

} 

所以,你可以再做:

Query.select("field1", "field2").from(myList).... 

你需要跟蹤它的值已經各點,以及他們是否下一個條件被選中應該添加到它們(如在or的情況下)或從中移除(如在and的情況下)。會有很多邊緣情況。我的建議是用類似的ints例子非常簡單的開始,並從那裏工作。

當你在幹什麼的對象版本,你需要使用reflection訪問對象的字段。

一旦你這樣做,你可能要考慮使用generics改進代碼的類型安全。

總而言之,大量的範圍爲一個有趣的項目。然而,感覺就像是那種會有很多邊緣情況的東西,所以值得通過設計思考一下公平的一點,也不是一個壞主意做一個公平的一點unit testing.

+0

很好的解釋!我正在考慮使用反射,我喜歡使用像Query這樣的類而不是僅僅創建一組函數的想法。 – Jon

3

你在找什麼類似於C#中的LINQ。

您可以參考對於初學者

LINQ for Java tool

What is the Java equivalent for LINQ?

你可能也想看看lambda表達式是在C#中使用這些鏈接。我不確定還有什麼建議。

但是,如果你想在java中構建類似於LINQ的東西,那麼它有點複雜。您需要考慮大部分以面向對象的方式來無縫地形成sql查詢。如果是這種情況,那麼它的答案是很長的(或很大的錯誤..)

+0

我看更多建立一些東西。我想看到這樣的現有事情,以便參考我可以做的事情。感謝那些。 – Jon

1

所以像LINQ for Java?

那麼,有jxpath,它允許一個人在Java集合上進行XPath風格的查詢,這是你要找的。

jOOQ庫的查詢類似於您所描述的查詢,但它可以用於實際的數據庫,據我所知。