问题描述
我有这个实体:
public class DeskRoom {
@Id
private Long id;
private String name;
}
public class DeskRoomEquipment {
@Id
private Long id;
@ManyToOne
@JoinColumn(name = "desk_room_id")
private DeskRoom deskRoom;
@ManyToOne
@JoinColumn(name = "equipment_id")
private Equipment equipment;
}
public class Equipment {
@Id
private Long id;
private String name;
}
我想创建一个规范,通过设备名称列表过滤所有桌面房间。我试过这样的事情,但创建的查询是交叉连接。
public static Specification<DeskRoom> containsEquipment(final List<String> equipmentName) {
return (root,criteriaQuery,criteriaBuilder) -> {
final Root<DeskRoomEquipment> deskRoomEquipmentRoot = criteriaQuery.from(DeskRoomEquipment.class);
return criteriaBuilder.and(criteriaBuilder.equal(root,deskRoomEquipmentRoot.get("deskRoom")),deskRoomEquipmentRoot.get("equipment").get("name").in(equipmentName));
}
}
创建的查询:
select *
from desk_room deskroom0_
cross join desk_room_equipment deskroomeq1_
cross join equipment equipment3_
where deskroomeq1_.equipment_id = equipment3_.id
and deskroom0_.id = deskroomeq1_.desk_room_id
and (equipment3_.name in (?))
想要的查询:
select *
from desk_room deskroom0_
join desk_room_equipment deskroomeq1_ on deskroom0_.id = deskroomeq1_.desk_room_id
join equipment equipment3_ on deskroomeq1_.equipment_id = equipment3_.id
where (equipment3_.name in (?))
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)