JPQL 构造函数忽略具有 NULL 值的行

Posted

技术标签:

【中文标题】JPQL 构造函数忽略具有 NULL 值的行【英文标题】:JPQL Constructor ignoring Rows whose have a NULL value 【发布时间】: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 的行以排除任何数据设置问题? 【参考方案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 ")

【讨论】:

以上是关于JPQL 构造函数忽略具有 NULL 值的行的主要内容,如果未能解决你的问题,请参考以下文章

聚集函数

sql WHERE NOT选择不等于值的行。它忽略NULL值,因此在示例中,具有不是“USA”的国家/地区的行

第十二章:汇总数据

JavaScript中使用new操作符实例化对象时构造函数有返回值的情况分析

JPQL:在构造函数表达式中接收集合

JavaScript中使用new操作符实例化对象时构造函数有返回值的情况分析