【问题标题】:JPQL Constructor ignoring Rows whose have a NULL valueJPQL 构造函数忽略具有 NULL 值的行
【发布时间】:2020-12-01 21:24:50
【问题描述】:

我有以下声明:

@Query("SELECT "
        + "new com.app.model.RestaurantOrderPartial( "
            + "o.orderId, o.orderedAt, o.orderType, o.orderState, o.orderValue, o.deliveryPrice, o.deliveredBy, o.driver) "
        + "FROM Order o "
        + "WHERE o.restaurant.restaurantId = ?1 "
        + "AND o.orderedAt BETWEEN ?2 and ?3 "
        + "ORDER BY o.orderedAt DESC ")
List<RestaurantOrderPartial> getRestaurantOrdersCompressed(long restaurantId, LocalDateTime dateBeforePeriod, LocalDateTime now); //12 Month

表中o.driverNULL 的行,构造函数不构造对象的条目并且不将其包含在结果列表中

为什么会有这种行为?以及如何让构造函数在自定义对象RestaurantOrderPartial中包含Driver为空的条目,根据Column中的值,Driver对象将为空。

这是我的 POJO:

public class RestaurantOrderPartial {
    
    private long orderId;
    private LocalDateTime orderedAt;
    private OrderType orderType;
    private OrderState orderState;
    private Long orderValue;
    
    
    private int deliveryPrice;
    private DeliveredBy deliveredBy;
    private Driver driver;

}

public class Driver {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long driverId;

@Column
private String email;

@Column
private String password;

@Column
private String fullName;

@Column
private String phoneNumber;

@Column
private String secondaryPhoneNumber;

@Column
private String fullAddress;

@Column
private boolean isActive;

@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "cityId")    
private City city;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "locationId")
private Location location;

@JsonIgnore
@OneToMany(mappedBy="driver")
private List<Order> orders;

样本数据:

感谢您的帮助。

【问题讨论】:

  • 如果 driver 为 null,是否设置了 restaurantId 和 oderedAt?
  • 是的。除了 o.driver,一切都设置好了。驱动程序(在相应表中引用驱动程序的列中的 ID)为空。
  • 能否展示一下班级和样本数据
  • 请查看我更新的问题
  • 您是否对数据库运行了休眠生成的查询以确保返回的数据包含驱动程序值为null 的行以排除任何数据设置问题?

标签: java sql spring constructor jpql


【解决方案1】:

如果要获取 o.driver 如果它为 null,则必须指定左外连接; o.driver 始终是一个内连接,因此会从结果中过滤掉空值。

尝试类似的东西

"SELECT "
        + "new com.app.model.RestaurantOrderPartial( "
            + "o.orderId, o.orderedAt, o.orderType, o.orderState, o.orderValue, o.deliveryPrice, o.deliveredBy, driver) "
        + "FROM Order o LEFT OUTER JOIN o.driver driver"
        + "WHERE o.restaurant.restaurantId = ?1 "
        + "AND o.orderedAt BETWEEN ?2 and ?3 "
        + "ORDER BY o.orderedAt DESC ")

【讨论】:

    猜你喜欢
    • 2017-03-08
    • 2020-10-18
    • 1970-01-01
    • 2021-04-29
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多