2016-06-01 10 views
-1

私はSpring Boot/MVCを使用しています。 私はJpaRepositoryを使用してカスタムクエリを持っている:Spring Data JPA - カスタムネイティブクエリの非エンティティ列の値を取得する

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列を持っている見ることができるように、それはの一部ではありませんエンティティクラス私の問題は、どのようにしてその列の価値を得ることができるかということです。一部の人は、別のDTOを使用してservice_typesカラムをマッピングできると言っていますか?または、私は '新しい'キーワードを使用できますか?たぶんあなたは私の仕事をしています。私はまた、一時的な列service_typesを作成しようとしましたが、うまくいきませんでした。

これは私のエンティティクラスである:

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に置き換えリポジトリを作る追加:

@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 interface WorkOrderRepository extends JpaRepository<WorkOrderDTO, Integer> 

しかし、私がそれを行うときは、オートワイヤリングの問題があります。

+1

あなたは本当に8時間ごとに同じ質問をしますか? –

+0

あなたが「DTOを使用する」と言ったこれらの「何人か」のアドバイスを受けたとき、何が起こったのですか?それは何が起こったかについての情報なしでは完全に無意味になるため、「うまくいかない」とは言わない。 –

+0

@NeilStockton何が起こったのかを追加するために投稿を編集しました。私は基本的にautowiringの問題に遭遇しました。 – Lester

答えて

0

私は自分の問題を解決しました。 私は

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

を@SqlResultMapping使用し、私はWorkOrderDTO名前付きエンティティではない新しいPOJOを作成しました。

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

最後に、同じ問題を投稿して私を嫌ったユーザーはもう迷惑をかけません。

関連する問題