我是Hibernate的初学者,我想使用CriteriaQuery从两个以上的表中进行选择。
我有3张桌子:手机,手机和手机范围价格和 我想从这三个表中获取数据。 例如:下面的查询从表中获取数据:
Select cellphone.cellphoneID, cellphone.cellphoneName, cellphoneImages.cellphoneImageID, cellphoneImages.cellphoneImageInternalLink,
cellphoneImages.cellphoneImageExternalLink, cellphoneRangedPrices.cellphoneRangedPricesID, cellphoneRangedPrices.cellphoneRangedPriceStart, cellphoneRangedPrices.cellphoneRangedPriceEnd
FROM cellphone, cellphoneImages, cellphoneRangedPrices
WHERE cellphone.cellphoneID = cellphoneImages.cellphoneID AND cellphone.cellphoneID = cellphoneRangedPrices.cellphoneID;
但我想使用CriteriaQuery来获取它。我试过这样做。
public List getAllCellphoneData(){
EntityManager em = mySQLDAO.getEm();
try {
CriteriaQuery<Object[]> criteriaQuery = em.getCriteriaBuilder().createQuery(Object[].class);
Root<Cellphone> rootPhone = criteriaQuery.from(Cellphone.class);
Root<CellphoneImages> rootImages = criteriaQuery.from(CellphoneImages.class);
criteriaQuery.multiselect(rootImages,rootPhone);
criteriaQuery.where(em.getCriteriaBuilder().equal(rootImages.get("cellphone"), rootPhone.get("cellphoneID")));
Query query = em.createQuery(criteriaQuery);
List<Object[]> resultList = query.getResultList();
return null;
} catch (Exception e) {
logger.log(Level.SEVERE, "Error when trying get cellphone information.", e);
throw new PersistenceException(e);
} finally {
em.close();
}
}
它正在工作,但我不知道如何在此标准查询中添加多个类。
我希望帮助了解如何做到这一点。 实际上,上面的方法可以从手机和手机图像表中获取数据,但我不知道我需要在代码中做什么才能从另一个表(手机范围价格(获取数据。
我尝试在其他堆栈流帖子中搜索,但没有找到。
注意:手机RagedPrice表具有来自手机表的外键(类似于手机图像表(
非常感谢您的帮助
我找到了我的问题的解决方案。 基本上我需要在同一个"WHERE"子句中添加另一个.第三张桌子上的类。
criteriaQuery.multiselect(rootPhone,rootImages,rootRangedPrices);
criteriaQuery.where(em.getCriteriaBuilder().equal(rootImages.get("cellphone"), rootPhone.get("cellphoneID")),
em.getCriteriaBuilder().equal(rootPhone.get("cellphoneID"), rootRangedPrices.get("cellPhone")));
请遵循以下完整代码:
public List<CellphoneVO> getAllCellphoneData(){
EntityManager em = mySQLDAO.getEm();
List<CellphoneVO> cellphoneVOList = new ArrayList<>();
try {
CriteriaQuery<Object[]> criteriaQuery = em.getCriteriaBuilder().createQuery(Object[].class);
Root<Cellphone> rootPhone = criteriaQuery.from(Cellphone.class);
Root<CellphoneImages> rootImages = criteriaQuery.from(CellphoneImages.class);
Root<CellphoneRangedPrices> rootRangedPrices = criteriaQuery.from(CellphoneRangedPrices.class);
criteriaQuery.multiselect(rootPhone,rootImages,rootRangedPrices);
criteriaQuery.where(em.getCriteriaBuilder().equal(rootImages.get("cellphone"), rootPhone.get("cellphoneID")),
em.getCriteriaBuilder().equal(rootPhone.get("cellphoneID"), rootRangedPrices.get("cellPhone")));
Query query = em.createQuery(criteriaQuery);
List<Object[]> resultList = query.getResultList();
for(Object[] objects : resultList){
CellphoneVO cellphoneVO = new CellphoneVO();
Cellphone cellphone = (Cellphone)objects[0];
CellphoneImages cellphoneImages = (CellphoneImages)objects[1];
CellphoneRangedPrices cellphoneRangedPrices = (CellphoneRangedPrices)objects[2];
cellphoneVO.setCellphone(cellphone);
cellphoneVO.setCellphoneImages(cellphoneImages);
cellphoneVO.setCellphoneRangedPrices(cellphoneRangedPrices);
cellphoneVOList.add(cellphoneVO);
}
return cellphoneVOList;
} catch (Exception e) {
logger.log(Level.SEVERE, "Error when trying get cellphones data.", e);
throw new PersistenceException(e);
} finally {
em.close();
}
}