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\nRun Code Online (Sandbox Code Playgroud)\n表中的行,o.driver其中NULL,构造函数不会构造对象的条目,并且不会包含它在结果列表中。
为什么它有这种行为?以及如何让构造函数在自定义对象中包含 Driver 为 null 的条目RestaurantOrderPartial根据 Column 中的值,Driver 对象将为 null。
这是我的 POJO:
\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\npublic 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;\nRun Code Online (Sandbox Code Playgroud)\n感谢您的帮助。
\n如果要在 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)