Spring Data JPA - 获取自定义本机查询的非实体列的值
Spring Data JPA - Get the values of a non-entity column of a custom native query
我正在使用 Spring Boot/MVC。
我有一个使用 JpaRepository 的自定义查询:
public interface WorkOrderRepository extends JpaRepository<WorkOrder, 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')", nativeQuery = true)
Collection<WorkOrder> findWorkOrdersByFleet(Long fleetCompanyID);
}
它returns以下table:
如您所见,它有 service_types 列,这是 Concat 的结果,它不是实体 class 的一部分。我的问题是如何获得该列的值。有人说我可以使用单独的 DTO 来映射 service_types 列?或者我可以使用 'new' 关键字?也许你对我有其他的工作。我也尝试制作一个临时列 service_types 但它没有用。
这是我的实体class:
@Entity
@Table(name="workorder")
public class WorkOrder {
@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;
//@Column(name="serviceTypes")
@Transient
private int 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 int getServiceTypes() {
return serviceTypes;
}
public void setServiceTypes(int serviceTypes) {
this.serviceTypes = serviceTypes;
}
}
有人告诉我做一个DTO:
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;
}
}
并添加将存储库从 WorkOrder 替换为 WorkOrderDTO。
public interface WorkOrderRepository extends JpaRepository<WorkOrderDTO, Integer>
但是当我这样做时,我遇到了自动装配问题。
终于解决了自己的问题!!!
我使用了@SqlResultMapping
SqlResultSetMapping(
name="workorder",
classes={
@ConstructorResult(
targetClass=WorkOrderDTO.class,
columns={
@ColumnResult(name="wo_number", type = Long.class),
@ColumnResult(name="service_types", type = String.class),
@ColumnResult(name="order_title", type = String.class)
}
)
}
)
并且我创建了一个新的 POJO,它不是名为 WorkOrderDTO 的实体。
@PersistenceContext
private EntityManager em;
@Override
public Collection<WorkOrderDTO> getWork() {
Query query = em.createNativeQuery(
"SELECT Sub1.wo_number, Sub2.service_types, Sub1.order_title 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=4 AND (order_status='On-Bidding' OR order_status='Draft')", "workorder");
@SuppressWarnings("unchecked")
Collection<WorkOrderDTO> dto = query.getResultList();
Iterable<WorkOrderDTO> itr = dto;
return (Collection<WorkOrderDTO>)itr;
}
终于,那些讨厌我发布同样问题的用户再也不会被惹恼了。
我正在使用 Spring Boot/MVC。 我有一个使用 JpaRepository 的自定义查询:
public interface WorkOrderRepository extends JpaRepository<WorkOrder, 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')", nativeQuery = true)
Collection<WorkOrder> findWorkOrdersByFleet(Long fleetCompanyID);
}
它returns以下table:
如您所见,它有 service_types 列,这是 Concat 的结果,它不是实体 class 的一部分。我的问题是如何获得该列的值。有人说我可以使用单独的 DTO 来映射 service_types 列?或者我可以使用 'new' 关键字?也许你对我有其他的工作。我也尝试制作一个临时列 service_types 但它没有用。
这是我的实体class:
@Entity
@Table(name="workorder")
public class WorkOrder {
@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;
//@Column(name="serviceTypes")
@Transient
private int 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 int getServiceTypes() {
return serviceTypes;
}
public void setServiceTypes(int serviceTypes) {
this.serviceTypes = serviceTypes;
}
}
有人告诉我做一个DTO:
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;
}
}
并添加将存储库从 WorkOrder 替换为 WorkOrderDTO。
public interface WorkOrderRepository extends JpaRepository<WorkOrderDTO, Integer>
但是当我这样做时,我遇到了自动装配问题。
终于解决了自己的问题!!! 我使用了@SqlResultMapping
SqlResultSetMapping(
name="workorder",
classes={
@ConstructorResult(
targetClass=WorkOrderDTO.class,
columns={
@ColumnResult(name="wo_number", type = Long.class),
@ColumnResult(name="service_types", type = String.class),
@ColumnResult(name="order_title", type = String.class)
}
)
}
)
并且我创建了一个新的 POJO,它不是名为 WorkOrderDTO 的实体。
@PersistenceContext
private EntityManager em;
@Override
public Collection<WorkOrderDTO> getWork() {
Query query = em.createNativeQuery(
"SELECT Sub1.wo_number, Sub2.service_types, Sub1.order_title 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=4 AND (order_status='On-Bidding' OR order_status='Draft')", "workorder");
@SuppressWarnings("unchecked")
Collection<WorkOrderDTO> dto = query.getResultList();
Iterable<WorkOrderDTO> itr = dto;
return (Collection<WorkOrderDTO>)itr;
}
终于,那些讨厌我发布同样问题的用户再也不会被惹恼了。