Spring 引导自动装配问题:不是托管类型
Spring Boot Autowiring Problems: Not An Managed Type
我有一个存储库 class:
public interface WorkOrderRepository extends JpaRepository<WorkOrderDTO, Integer> {
@Query(value = "SELECT * FROM (SELECT * FROM workorder) Sub1 INNER JOIN (SELECT wo_number, GROUP_CONCAT(service_type SEPARATOR ', ') AS 'service_types' FROM service_type GROUP BY wo_number) Sub2 ON Sub1.wo_number=Sub2.wo_number WHERE fleet_company_id=?1 AND (order_status='On-Bidding' OR order_status='Draft')")
Collection<WorkOrderDTO> findWorkOrdersByFleet(Long fleetCompanyID);
@Query(value = "SELECT * FROM workorder WHERE fleet_company_id=?1")
Collection<WorkOrderDTO> findWorkOrdersByFleet1(Long fleetCompanyID);
}
还有一个实体class:
@Entity
@Table(name="workorder")
public class WorkOrder implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="wo_number")
private Long woNumber;
@ManyToOne(optional=false, cascade=CascadeType.ALL)
@JoinColumn(name = "vehicle_id")
private Vehicle vehicle;
@ManyToOne(optional=false, cascade=CascadeType.ALL)
@JoinColumn(name = "fleet_company_id")
private FleetCompany fleetCompany;
@Column(name="order_title")
private String orderTitle;
@Column(name="order_date")
private String orderDate;
@Column(name="order_time")
private String orderTime;
@Column(name="order_status")
private String orderStatus;
@Column(name="ref_number")
private String refNumber;
@Column(name="proposals")
private int proposals;
@Transient
private String serviceTypes;
public WorkOrder() {
super();
}
public Long getWoNumber() {
return woNumber;
}
public void setWoNumber(Long woNumber) {
this.woNumber = woNumber;
}
public String getOrderTitle() {
return orderTitle;
}
public void setOrderTitle(String orderTitle) {
this.orderTitle = orderTitle;
}
public String getOrderDate() {
return orderDate;
}
public void setOrderDate(String orderDate) {
this.orderDate = orderDate;
}
public String getOrderTime() {
return orderTime;
}
public void setOrderTime(String orderTime) {
this.orderTime = orderTime;
}
public String getOrderStatus() {
return orderStatus;
}
public void setOrderStatus(String orderStatus) {
this.orderStatus = orderStatus;
}
public String getRefNumber() {
return refNumber;
}
public void setRefNumber(String refNumber) {
this.refNumber = refNumber;
}
public int getProposals() {
return proposals;
}
public void setProposals(int proposals) {
this.proposals = proposals;
}
public Vehicle getVehicle() {
return vehicle;
}
public void setVehicle(Vehicle vehicle) {
this.vehicle = vehicle;
}
public FleetCompany getFleetCompany() {
return fleetCompany;
}
public void setFleetCompany(FleetCompany fleetCompany) {
this.fleetCompany = fleetCompany;
}
public String getServiceTypes() {
return serviceTypes;
}
public void setServiceTypes(String serviceTypes) {
this.serviceTypes = serviceTypes;
}
}
我有一个扩展实体的 pojo class:
public class WorkOrderDTO extends WorkOrder {
private String service_types;
public WorkOrderDTO() {
super();
}
public WorkOrderDTO(String service_types) {
this.service_types = service_types;
}
public String getService_types() {
return service_types;
}
public void setService_types(String service_types) {
this.service_types = service_types;
}
}
我想将 POJO WorkOrderDTO
传递给 JpaRepository
而不是它映射列 service_types 的实体实体的一部分 class。但是当我设置 WorkOrderDTO
而不是 WorkOrder
时,我遇到了自动装配问题。也许,这是一些注释问题。我没有给 POJO 添加任何注释。
您可以使用 "new" 运算符。您必须使用所需的值在 WorkOrderDTO 中创建一个构造函数,例如
public WorkOrderDTO(String serviceTypes) {
this.service_types = serviceTypes;
}
然后你可以像在 jpql 中那样使用它 - 查询:
@Query(value = "SELECT new your.package.WorkorderDTO(w.<select servicetypes somehow>) FROM workorder w WHERE fleet_company_id=?1")
但是,我发现您的第一个查询令人困惑,我认为它应该是本机查询...您不能使用 "new" 运算符。
也许您可以将 Vehicle 或 FleetCompany 等服务类型映射为列表?然后,您可以只为 DTO 连接列表中的值。
编辑:您可以使用@OneToMany 来映射一个列表,因为它可能在您的车辆 class 中用于 WorkOrder,只是为了澄清我之前的段落。
我有一个存储库 class:
public interface WorkOrderRepository extends JpaRepository<WorkOrderDTO, Integer> {
@Query(value = "SELECT * FROM (SELECT * FROM workorder) Sub1 INNER JOIN (SELECT wo_number, GROUP_CONCAT(service_type SEPARATOR ', ') AS 'service_types' FROM service_type GROUP BY wo_number) Sub2 ON Sub1.wo_number=Sub2.wo_number WHERE fleet_company_id=?1 AND (order_status='On-Bidding' OR order_status='Draft')")
Collection<WorkOrderDTO> findWorkOrdersByFleet(Long fleetCompanyID);
@Query(value = "SELECT * FROM workorder WHERE fleet_company_id=?1")
Collection<WorkOrderDTO> findWorkOrdersByFleet1(Long fleetCompanyID);
}
还有一个实体class:
@Entity
@Table(name="workorder")
public class WorkOrder implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="wo_number")
private Long woNumber;
@ManyToOne(optional=false, cascade=CascadeType.ALL)
@JoinColumn(name = "vehicle_id")
private Vehicle vehicle;
@ManyToOne(optional=false, cascade=CascadeType.ALL)
@JoinColumn(name = "fleet_company_id")
private FleetCompany fleetCompany;
@Column(name="order_title")
private String orderTitle;
@Column(name="order_date")
private String orderDate;
@Column(name="order_time")
private String orderTime;
@Column(name="order_status")
private String orderStatus;
@Column(name="ref_number")
private String refNumber;
@Column(name="proposals")
private int proposals;
@Transient
private String serviceTypes;
public WorkOrder() {
super();
}
public Long getWoNumber() {
return woNumber;
}
public void setWoNumber(Long woNumber) {
this.woNumber = woNumber;
}
public String getOrderTitle() {
return orderTitle;
}
public void setOrderTitle(String orderTitle) {
this.orderTitle = orderTitle;
}
public String getOrderDate() {
return orderDate;
}
public void setOrderDate(String orderDate) {
this.orderDate = orderDate;
}
public String getOrderTime() {
return orderTime;
}
public void setOrderTime(String orderTime) {
this.orderTime = orderTime;
}
public String getOrderStatus() {
return orderStatus;
}
public void setOrderStatus(String orderStatus) {
this.orderStatus = orderStatus;
}
public String getRefNumber() {
return refNumber;
}
public void setRefNumber(String refNumber) {
this.refNumber = refNumber;
}
public int getProposals() {
return proposals;
}
public void setProposals(int proposals) {
this.proposals = proposals;
}
public Vehicle getVehicle() {
return vehicle;
}
public void setVehicle(Vehicle vehicle) {
this.vehicle = vehicle;
}
public FleetCompany getFleetCompany() {
return fleetCompany;
}
public void setFleetCompany(FleetCompany fleetCompany) {
this.fleetCompany = fleetCompany;
}
public String getServiceTypes() {
return serviceTypes;
}
public void setServiceTypes(String serviceTypes) {
this.serviceTypes = serviceTypes;
}
}
我有一个扩展实体的 pojo class:
public class WorkOrderDTO extends WorkOrder {
private String service_types;
public WorkOrderDTO() {
super();
}
public WorkOrderDTO(String service_types) {
this.service_types = service_types;
}
public String getService_types() {
return service_types;
}
public void setService_types(String service_types) {
this.service_types = service_types;
}
}
我想将 POJO WorkOrderDTO
传递给 JpaRepository
而不是它映射列 service_types 的实体实体的一部分 class。但是当我设置 WorkOrderDTO
而不是 WorkOrder
时,我遇到了自动装配问题。也许,这是一些注释问题。我没有给 POJO 添加任何注释。
您可以使用 "new" 运算符。您必须使用所需的值在 WorkOrderDTO 中创建一个构造函数,例如
public WorkOrderDTO(String serviceTypes) {
this.service_types = serviceTypes;
}
然后你可以像在 jpql 中那样使用它 - 查询:
@Query(value = "SELECT new your.package.WorkorderDTO(w.<select servicetypes somehow>) FROM workorder w WHERE fleet_company_id=?1")
但是,我发现您的第一个查询令人困惑,我认为它应该是本机查询...您不能使用 "new" 运算符。
也许您可以将 Vehicle 或 FleetCompany 等服务类型映射为列表?然后,您可以只为 DTO 连接列表中的值。
编辑:您可以使用@OneToMany 来映射一个列表,因为它可能在您的车辆 class 中用于 WorkOrder,只是为了澄清我之前的段落。