我很好奇爲什麼有可能使用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這樣的其他查詢框架能否爲這個問題提供更好的解決方案?
我剛剛看了一下Querydsl,它肯定看起來非常非常好。我喜歡它。唯一的缺點是依賴關係的數量。我真的需要所有這些嗎?是否有文檔說明哪些功能需要哪些罐子? –
你關心哪些依賴關係?沒有文檔聲明哪個依賴項用於哪個功能。 –
我是否需要像antlr,asm,glib,ecj,番石榴,validation-api等東西,如果我只想擁有漂亮的JPA查詢? –