2012-10-19 39 views
2

我很好奇爲什麼有可能使用JPA2的CriteriaBuilder類來創建這樣的查詢。假設我有一個User類,持續String稱爲name作爲屬性。爲什麼我可以寫這個?在JPA中,爲什麼CriteriaBuilder讓我在不相關的類型之間構建不健全的謂詞?

CriteriaBuilder builder = mgr.getCriteriaBuilder(); 

CriteriaQuery<User> crit = builder.createQuery(User.class); 
Root<User> user = crit.from(User.class);      // 1 
crit.select(user) 
    .where(builder.equal(user.get(User_.name), 2.5));  // 2 

首先,在標記1:爲什麼我必須再次指示User.class?不是我的CriteriaQuery應該知道我對用戶感興趣嗎?在這裏可能注入其他課程是不是打破了類型安全?

其次,在標記2處:name屬性是String。爲什麼我可以像這樣編纂廢話,比較String和double?換句話說,爲什麼是叫equal這個方法的簽名:

public Predicate equal(Expression<?> x, Object y) 

,而不是一個可能更具類型安全的版本如下?

public <T> Predicate equal(Expression<T> x, T y) 

Querydsl這樣的其他查詢框架能否爲這個問題提供更好的解決方案?

回答

2

我相信JPA 2 Criteria API的類型安全方面是在規範過程的相當晚的時候添加的。這就是爲什麼它不一致。

Querydsl比JPA 2 Criteria API更簡潔,也更類型安全。 Querydsl使用流利的建造者而不是工廠類來創建謂詞,所以可以在這裏找到相應的方法http://www.querydsl.com/static/querydsl/2.8.0/apidocs/com/mysema/query/types/expr/SimpleExpression.html#eq%28T%29

我是Querydsl的維護者,所以這個答案是有偏見的。

+0

我剛剛看了一下Querydsl,它肯定看起來非常非常好。我喜歡它。唯一的缺點是依賴關係的數量。我真的需要所有這些嗎?是否有文檔說明哪些功能需要哪些罐子? –

+0

你關心哪些依賴關係?沒有文檔聲明哪個依賴項用於哪個功能。 –

+0

我是否需要像antlr,asm,glib,ecj,番石榴,validation-api等東西,如果我只想擁有漂亮的JPA查詢? –

相關問題