OpenJPA 连接查询没有 return 任何数据
OpenJPA join query does not return any data
我有这样的实体结构来保持建筑物、房间和楼层:
建筑物 -- 一对多 -- 楼层 -- 一对多房间
我正在查看条件 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()));
但也无济于事。我一直收到空列表或异常。
获得所有建筑房间的正确方法是什么?
正确的加入代码是:
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);
我有这样的实体结构来保持建筑物、房间和楼层:
建筑物 -- 一对多 -- 楼层 -- 一对多房间
我正在查看条件 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()));
但也无济于事。我一直收到空列表或异常。
获得所有建筑房间的正确方法是什么?
正确的加入代码是:
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);