You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JPA原生查询结果与pgAdmin不一致问题求助

问题:JPA原生查询返回结果与PGAdmin测试不一致

我需要查询指定入住(check_in)和退房(check_out)日期内无预订记录的房间,编写了JPA原生查询,在pgAdmin中测试逻辑正常,但在Repository中调用时返回的Room实体结果却不一致。

我尝试过以下方法,但问题仍未解决:

  • 使用左连接筛选无预订的行
  • 修改Reservation实体中Room属性的FetchType为EAGER

相关代码

查询代码

@Query(value = "SELECT * FROM \"room\" r " +
            "WHERE r.\"id\" NOT IN (" +
            "SELECT rv.\"room_id\" " +
            "FROM \"reservation\" rv " +
            "WHERE :checkInDate < rv.\"check_out\" " +
            "AND :checkOutDate > rv.\"check_in\") " +
            "AND r.\"kids\" = :kids " +
            "AND r.\"adult\" = :adults",
            nativeQuery = true)
List<Room> findAvailableRooms(@Param("checkInDate") LocalDate checkInDate,
                              @Param("checkOutDate") LocalDate checkOutDate,
                              @Param("kids") int kids,
                              @Param("adults") int adults);

Reservation实体

package com.example.hotelManagmentSystem.dataproviders.entity;

import jakarta.persistence.*;
import lombok.*;

import java.time.LocalDate;

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "reservation")
public class Reservation {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false)
    private Integer id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "hotel_id")
    private Hotel hotel;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "client_id")
    private User client;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "room_id")
    private Room room;

    @Column(name = "check_in")
    private LocalDate checkIn;

    @Column(name = "check_out")
    private LocalDate checkOut;

    @Column(name = "adults")
    private Integer adults;

    @Column(name = "kids")
    private Integer kids;

    @Column(name = "net_value")
    private Double netValue;

    @Column(name = "tax_rate")
    private Double taxRate;

    @Column(name = "discount")
    private Double discount;

    @Column(name = "created_at")
    private LocalDate createdAt;

    @Column(name = "total")
    private Double total;
}

Room实体

package com.example.hotelManagmentSystem.dataproviders.entity;

import jakarta.persistence.*;
import lombok.*;

import java.util.LinkedHashSet;
import java.util.Set;

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Entity
@Table(name = "room")
public class Room {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", nullable = false)
    private Integer id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "hotel_id")
    private Hotel hotel;

    @Column(name = "type")
    private String type;

    @Column(name = "adult")
    private Integer adult;

    @Column(name = "kids")
    private Integer kids;

    @Column(name = "description", length = Integer.MAX_VALUE)
    private String description;

    @OneToMany(mappedBy = "room")
    private Set<RoomPrice> roomPrices;
}

内容的提问来源于stack exchange,提问作者Maksimo RAMAJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:54:56