Spring JPA 使用规范与关联表的连接

问题描述

我有这个实体:

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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...