如何在Spring JPA(Query)中合并4个表

问题描述 投票:1回答:1

我有一个名为RoomBoy的数据表,数据是这样的

"room": {
            "id": 1,
            "roomId": 40,
            "floor": "1",
            "roomNumber": "107",
            "condition": null,
            "status": "Waiting"
        },
        "bedType": {
            "id": 1,
            "bedTypeName": "Twin Bed"
        },
        "roomCategory": {
            "id": 35,
            "categoryName": "Superior"
        },
        "guestName": "RIKO JANUAR"
    }

我也有一个名为RoomBoyDetail的表中的数据

    {
        "id": 1,
        "roomBoyId": 1,
        "productId": 3,
        "productName": {
            "id": 3,
            "productName": "HORS D’OEUVRE VARIE"
        },
        "qty": 3,
        "description": null
    },
    {
        "id": 2,
        "roomBoyId": 1,
        "productId": 4,
        "productName": {
            "id": 4,
            "productName": "CREAM OF VEGETABLES SOUP"
        },
        "qty": 2,
        "description": null
    },
    {
        "id": 3,
        "roomBoyId": 1,
        "productId": 5,
        "productName": {
            "id": 5,
            "productName": "RAVIOLI AU JUS"
        },
        "qty": 2,
        "description": null
    }

我想将这两个表合并,并使用相同的id(来自RoomBoy)和roomBoyId(来自RoomBoyDetail)。我的代码是这样的

@Query("select new com.acs.pms.model.ObjekRoomBoyDetail(a,b.bedType,b.roomCategory,c.guestName,d.productName,d.qty,d.description) from RoomBoy a left outer join RoomMaster b on a.roomId = b.id "
        + "left outer join ReservationDetail c on a.roomNumber = c.roomNumber where c.checkinStatus = true and c.checkoutStatus = false "
        + "left outer join RoomBoyDetail d on a.id = d.roomBoyId")
        Page<ObjekRoomBoyDetail> getAllDetail(
        Pageable paging);

而且我有错误的意外令牌:靠近第1行

java mysql spring spring-data-jpa left-join
1个回答
2
投票

您在where子句之后有一个左外部联接:

select new com.acs.pms.model.ObjekRoomBoyDetail(a,b.bedType,b.roomCategory,c.guestName,d.productName,d.qty,d.description) 
from RoomBoy a 
left outer join RoomMaster b on a.roomId = b.id 
left outer join ReservationDetail c on a.roomNumber = c.roomNumber 
where c.checkinStatus = true and c.checkoutStatus = false 
left outer join RoomBoyDetail d on a.id = d.roomBoyId

应该是

select new com.acs.pms.model.ObjekRoomBoyDetail(a,b.bedType,b.roomCategory,c.guestName,d.productName,d.qty,d.description) 
from RoomBoy a 
left outer join RoomMaster b on a.roomId = b.id 
left outer join ReservationDetail c on a.roomNumber = c.roomNumber 
left outer join RoomBoyDetail d on a.id = d.roomBoyId
where c.checkinStatus = true and c.checkoutStatus = false 
© www.soinside.com 2019 - 2024. All rights reserved.