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

skm*_*skm 5 java sql spring constructor jpql

我有以下声明:

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

表中的行,o.driver其中NULL,构造函数不会构造对象的条目,并且不会包含它在结果列表中。

\n

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

\n

这是我的 POJO:

\n
public class RestaurantOrderPartial {\n    \n    private long orderId;\n    private LocalDateTime orderedAt;\n    private OrderType orderType;\n    private OrderState orderState;\n    private Long orderValue;\n    \n    \n    private int deliveryPrice;\n    private DeliveredBy deliveredBy;\n    private Driver driver;\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n
public class Driver {\n\n@Id\n@GeneratedValue(strategy=GenerationType.IDENTITY)\nprivate Long driverId;\n\n@Column\nprivate String email;\n\n@Column\nprivate String password;\n\n@Column\nprivate String fullName;\n\n@Column\nprivate String phoneNumber;\n\n@Column\nprivate String secondaryPhoneNumber;\n\n@Column\nprivate String fullAddress;\n\n@Column\nprivate boolean isActive;\n\n@OneToOne(fetch = FetchType.EAGER)\n@JoinColumn(name = "cityId")    \nprivate City city;\n\n@ManyToOne(fetch = FetchType.EAGER)\n@JoinColumn(name = "locationId")\nprivate Location location;\n\n@JsonIgnore\n@OneToMany(mappedBy="driver")\nprivate List<Order> orders;\n
Run Code Online (Sandbox Code Playgroud)\n
\n

示例数据:\n样本数据

\n

感谢您的帮助。

\n

Chr*_*ris 2

如果要在 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 ")
Run Code Online (Sandbox Code Playgroud)