2014-04-03 64 views
0

之後目前,我有一個UserDao類創建使用CriteriaQuery查詢,例如要使用它的ID檢索數據庫中的User實例(讓我們調用該方法findById)。到目前爲止,這很簡單,而且工作正常。修改CriteriaQuery中的JOIN他們已被添加到CriteriaQuery中

但是,我也有一個GenericDao,它擴展了UserDao。在userDao.findById返回結果之前,它會將criteriaQuery傳遞給GenericDao,因此我可以爲criteriaQuery添加一些限制。

例子:

public class GenericDao 
{ 
    private EntityManager entityManager; 

    protected Object executeCriteriaQuery(CriteriaQuery criteriaQuery) 
    { 
     return entityManager.createQuery(prepareQuery(criteriaQuery)).getSingleResult(); 
    } 

    private CriteriaQuery prepareQuery(CriteriaQuery criteriaQuery) 
    { 
     // add restrictions to criteriaQuery 
     Predicate predicate = ... // some predicate which will be appended to the already formed criteriaQuery 

     criteriaQuery.where(criteriaBuilder.and(criteriaQuery.getRestriction(), predicate)); 

     return criteriaQuery; 
    } 
} 

public class UserDao extends GenericDao 
{ 
    public User findById(String id) 
    { 
     CriteriaQuery query = criteriaBuilder.createQuery(entityClass); 
     Root<P> entity = query.from(entityClass); 
     query.select(entity); 
     query.where(criteriaBuilder.equal(entity.get("id"), id.toUpperCase())); 

     return executeCriteriaQuery(query); 
    } 
} 

的事情是:那是建立在致以GenericDao可能包含JOIN的DAO的查詢。我想謂詞添加到被添加到criteriaQuery一個JOIN
從我所看到的,我可以通過使用From.getJoins()檢索查詢中的JOIN。但是,根據該方法的Javadoc:

返回已從此綁定類型創建的連接。如果沒有從此綁定類型進行連接,則返回空集。 修改設定的不影響查詢。

返回:聯接這種類型做出

如何我在criteriaQuery添加一個謂詞以JOIN條款?

+0

是什麼阻止你在具體的DAO類中建立/修改條件查詢,然後用'GenericDao'執行這些查詢? 這樣的做法能更好地分離責任和移動業務邏輯來具體的DAO,即'GenericDao'可能是抽象的'prepareQuery'梅託德,目前不能完全通用的抽象類。 – wypieprz

+0

@wypieprz我希望能夠條款添加到適用於建在每一個DAO每個查詢的查詢,這就是爲什麼我想在我的'GenericDao'來實現這一點。如果我在每個班級都這樣做,那麼每個DAO中的每個查詢都會有相同的代碼。 – Stefan

回答

0

經過一段時間,我決定對這個特定問題實施不同的方法。由於我找不到如何做到這一點的任何選項,我試圖在JPA實施級別上解決它。由於我使用Hibernate,我使用了Hibernate filters。對於的EclipseLink用戶:您可以將EclipseLink的Multi tenancy功能。

不幸的是,我一直無法找到更高級別的解決方案,所以如果我要切換實現,我仍然必須爲此編寫一個新的實現。在另一方面,我可能不會切換到新的實現定期,這樣可能不會是一個問題。