У меня проблемы с запросом вложенного списка объектов с помощью Spring Data JPA.
Вот мои сущности:
public class Shipment {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(updatable = false, nullable = false)
private Long id;
@CreationTimestamp
@Column(updatable = false)
private Date createdAt;
@UpdateTimestamp
private Date updatedAt;
private String orderId;
private String deliveryId;
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "shipment")
private List<Packet> packets;
// constructors, getters, setters omitted
}
и вложенный список:
@Entity
public class Packet {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(updatable = false, nullable = false)
private Long id;
@CreationTimestamp
@Column(updatable = false)
private Date createdAt;
@UpdateTimestamp
private Date updatedAt;
private String packetId;
@Enumerated(EnumType.STRING)
private PacketType packetType;
}
Тогда у меня есть простая конечная точка отдыха:
@GetMapping(path = "/shipments", produces = "application/json")
public List<ShippingIds> getShipments(SearchCriteria searchCriteria) {
List<Shipment> shipments = shipmentService.getShipmentIds(searchCriteria);
return buildShipmentIds(shipments);
}
И я использую SearchCriteria
в качестве queryParams (/shipments?packetId={packetId}&orderId={orderId}&deliveryId={deliveryId}...
И мой Сервис, где я использую query by example
:
public List<Shipment> getShipmentIds(SearchCriteria searchCriteria) {
Shipment shipment = Shipment.builder()
.orderId(searchCriteria.getOrderId())
.deliveryId(searchCriteria.getDeliveryId())
.packetId(searchCriteria.getPacketId())
.build();
// My problem is here - How do I do get the associated Shipment object if my search criteria is a packetId?
if (searchCriteria.getPacketId()!= null) {
return shipmentRepository.findByPackets_Packets_packetId(searchCriteria.getPacketId());
} else {
Example<Shipment> example = Example.of(shipment);
return shipmentRepository.findAll(example);
}
}
И мой репозиторий:
@Repository
public interface ShipmentRepository extends JpaRepository<Shipment, Long> {
List<Shipment> findByPackets_Packets_packetId(String packetId);
}
Поскольку мой объект Shipment
имеет список Packet
, я не могу просто включить его в Example
, или, по крайней мере, я не знаю как.
Но я должен иметь возможность извлечь соответствующую отправку на основе одной строки packetId
, верно?
Я получаю исключение:
Вызвано: org.springframework.data.mapping.PropertyReferenceException: Не найдено ни одного участка свойств для типа Packet! Вы имели в виду 'packageId'? определить запрос самостоятельно:
@Query("select s from Shipment s left join s.packets p where s.id = p.shipment")
Но тогда я получаю:
Вызывается: org.hibernate.QueryExcept ion: не удалось разрешить свойство: отгрузка: com.shipment.persistence.model.Packet
Хотя пересылка является моим внешним ключом.
Есть идеи, что я делаю не так? Или что я могу улучшить?