2010-08-12 53 views
3

我有一個模型,有幾個屬性。屬性可以是原始(String)或複雜(Object)。用戶可以對每個基本屬性進行查詢。我想知道是否有一種簡單的方法來動態構建查詢。我使用Java和Hibernate。動態查詢多個屬性與休眠

模型

public class Model { 
    String prop1; 
    Point prop2; 
    List<Shape> prop3; 
} 

PointShape是可以包含基元或對象的對象。查詢的一個例子是所有實例,其中prop1 =「A」,座標是x = 3和y = 8,其中一個形狀是圓形。 prop1 =「A」,prop2.x = 3,prop2.y和prop3.get(i).type =「Circle」;我們將不得不遍歷所有的prop3實例。

我的第一個想法是不可維護和低效的。它包括對所有基本屬性進行查詢,然後合併結果。

  • 獲取所有實例,其中爲prop1 = 「A」
  • 獲取所有實例,其中prop2.x = 3 和prop3 = Y;
  • 獲取所有的實例,其中的一個 Shape.type =「Circle」;
  • 獲取的所有3臺

的交集是否有可能在一個更好(更聰明)的方式解決這個問題的任何現有的庫或算法?

感謝

+0

你想查詢一個Shape的「Java類型」還是你有一個字段類型? – 2010-08-12 14:59:49

+0

我的例子與我的真實模型相比非常簡單,但是標準查詢就是我正在尋找的。 – Sydney 2010-08-13 18:39:19

回答

2

你有沒有看着Criteria queries?這是一個用於以編程方式構建查詢和參數的Hibernate功能。

如果你的目的是查詢符合所有這些條件的實體:

爲prop1 = 「A」 和prop2.x = 3和prop2.y和prop3.get(I).TYPE = 「圓」

association queries支持,那麼你可以做的條件查詢類似

Criteria criteria = session.createCriteria(Model.class); 
criteria.add(Restrictions.eq("prop1", "A")); 
criteria.createCriteria("prop2") 
    .add(Restrictions.eq("x", 3)); 
    .add(Restrictions.eq("y", 2)); 
criteria.createCriteria("prop3").add(Restrictions.in("type", "Circle")); 

List results = criteria.list(); 

真正的實力正在建造的代碼查詢,而TH一個HQL字符串 - 允許你動態添加/設置屬性等。

+0

當然,您可以在HQL中使用相同的查詢語句(使用INs,JOINs等)。 – 2010-08-12 00:59:24