【问题标题】:Spring Data JPA - Get the values of a non-entity column of a custom native querySpring Data JPA - 获取自定义本机查询的非实体列的值
【发布时间】:2016-09-30 20:51:30
【问题描述】:

我正在使用 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);
 }

它返回下表:

http://imgur.com/Ylkc6U0

你可以看到它有 service_types 列,这是 Concat 的结果,它不是实体类的一部分。我的问题是如何获得该列的值。有人说我可以使用单独的 DTO 来映射 service_types 列?或者我可以使用“新”关键字?也许你对我有其他的工作。我也尝试过创建一个临时列 service_types 但它没有用。

这是我的实体类:

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

但是当我这样做时,我遇到了自动装配问题。

【问题讨论】:

  • 你真的打算每 8 小时问一次同样的问题吗?
  • 当您听取这些“一些”说“使用 DTO”的建议时,发生了什么?并且不要说“它不起作用”,因为如果没有关于发生了什么的信息,该声明将完全没有意义。
  • @NeilStockton 我编辑了我的帖子以添加发生的事情。我基本上遇到了自动装配问题。
  • @M.Deinum 感谢您推动我解决自己的问题。

标签: java hibernate spring-mvc jpa spring-data-jpa


【解决方案1】:

我自己的问题终于解决了!!! 我使用了@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;
}

最后,讨厌我发布同样问题的用户不会再生气了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-07
    • 2015-03-25
    • 1970-01-01
    • 2019-01-07
    • 2012-09-13
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多