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

问题描述

我有以下声明:

@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的行,构造函数没有将条目构造为对象,并且没有将其包括在结果列表中。 / p>

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

这是我的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;

样本数据:

sample data

感谢您的帮助。

解决方法

如果要在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 ")