2016-05-31 2 views
1

У меня есть класс репозитория:Spring Загрузочной автоматическое связывание проблема: не является Managed Тип

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 WorkOrderDTO в JpaRepository вместо сущности для него p column service_types, который не является частью класса сущности. Но у меня проблемы с автосохранением, когда я установил WorkOrderDTO вместо WorkOrder. Возможно, это проблема аннотаций. Я не писал никаких комментариев к POJO.

+0

Вы можете отображать объекты только в том случае, если исключение говорит вам, что «WorkOrderDTO» не является сущностью и как таковой не будет работать. –

+0

@M. Deinum Некоторые пользователи здесь сказали мне, что я могу это сделать, если нет. Как я могу получить столбец, который не является частью объекта, который будет отображаться с помощью thymeleaf? – 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 в виде списка? Затем вы можете объединить только значения в списке для вашего DTO.

EDIT: вы можете использовать @OneToMany для отображения списка, поскольку он, вероятно, находится в вашем классе Vehicle for WorkOrder, просто для уточнения моего предыдущего абзаца.

+0

Должен ли я расширять JpaRepository или расширять JpaRepository ? – Lester

+0

Использование JpaRepository

+0

Проблема заключается в том, что мне нужен первый запрос, потому что у него есть servicetypes, у второго - только рабочие. – Lester

Смежные вопросы