2016-05-31 66 views
1

我有一个仓储类:春天开机自动装配的问题:不是托管类型

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); 
} 

以及实体类:

@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:

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 WorkOrderDTOJpaRepository而不是它的实体为ma p列service_types它不是实体类的一部分。但是当我设置WorkOrderDTO而不是WorkOrder时,我遇到了自动装配问题。也许,这是一些注释问题。我没有对POJO做任何注释。

+0

您只能映射实体,因为异常告诉您“WorkOrderDTO”不是实体,因此不起作用。 –

+0

@M。 Deinum这里的一些用户告诉我,如果不是,我可以做到这一点。如何获得不属于使用百里香叶显示的实体的列? – Lester

+0

我没有说你不能这样做,你不能像你现在所做的那样去做。我强烈建议阅读JPA如何工作以及如何查询返回自定义结果。 –

回答

0

您可以使用“新”运算符。您必须使用您需要的值在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") 

不过,我觉得你的第一个查询混乱,我认为这应该是本机查询...有你不能使用“新”操作符。

也许您可能将ServiceType(如Vehicle或FleetCompany)映射为List?然后你可以连接你的DTO列表中的值。

编辑:你可以使用@OneToMany来映射一个List,因为它可能在WorkOrder的Vehicle类中,只是为了阐明我以前的段落。

+0

我应该扩展JpaRepository 还是扩展JpaRepository ? – Lester

+0

使用JpaRepository

+0

问题是我需要的是第一个查询,因为它有服务类型,第二个查询只有工作。 – Lester