我有实体结构用于保持建筑物,房间和地板如下:
建筑 - 一对多 - 楼层 - 一对多房间
我正在关注Criteria API,我的目标是让所有房间首先与同一楼层相关联,而不是找到与同一建筑物相关的所有房间。
至于第一项任务,我成功完成了以下代码:
CriteriaQuery<TRoom> criteria = em.getCriteriaBuilder().createQuery(TRoom.class);
Root<TRoom> troom = criteria.from(TRoom.class);
Predicate condition = em.getCriteriaBuilder().equal(troom.get("tfloor"), em.find(TFloor.class, targetRoom.getFloor().getId()));
List<TRoom> trooms = em.createQuery(criteria.where(condition)).getResultList();
我试过用不同的路径(例如“troom.get(”tfloor.tbuilding“)”或troom.get(“tfloor”)。get(“tbuilding”))和连接一样这样:
Join<TRoom, TFloor> join = troom.join("tfloor");
Predicate condition = em.getCriteriaBuilder().equal(join.get("tbuilding") , em.find(TFloor.class, targetRoom.getFloor().getBuilding().getBuildingId()));
但也没有用。我一直得到空列表或例外。
建造所有房间的正确方法是什么?
答案 0 :(得分:0)
正确的加入代码是:
CriteriaQuery<TRoom> criteria = em.getCriteriaBuilder().createQuery(TRoom.class);
Root<TRoom> troom = criteria.from(TRoom.class);
Predicate condition = em.getCriteriaBuilder().equal(troom.join("tfloor").get("tbuilding"), targetBuilding);