之後目前,我有一個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
條款?
是什麼阻止你在具體的DAO類中建立/修改條件查詢,然後用'GenericDao'執行這些查詢? 這樣的做法能更好地分離責任和移動業務邏輯來具體的DAO,即'GenericDao'可能是抽象的'prepareQuery'梅託德,目前不能完全通用的抽象類。 – wypieprz
@wypieprz我希望能夠條款添加到適用於建在每一個DAO每個查詢的查詢,這就是爲什麼我想在我的'GenericDao'來實現這一點。如果我在每個班級都這樣做,那麼每個DAO中的每個查詢都會有相同的代碼。 – Stefan