2015-06-11 26 views
13

Điều này đã được đăng trước đó nhưng vấn đề của tôi hơi khác một chút. Đây là truy vấn JPQL trong câu hỏi:Tên cho tham số ràng buộc không được rỗng hoặc trống! Đối với các tham số được đặt tên, bạn cần phải sử dụng @Param cho các tham số phương thức truy vấn trên các phiên bản Java

@Query("SELECT NEW com.htd.domain.ShopOrder(po.id, po.po_number, " 
      + "po.due_date, po_part.id, po_part.part_quantity, " 
      + "part.id, part.part_number, part.part_description, " 
      + "part.plasma_hrs_per_part, part.grind_hrs_per_part, " 
      + "part.mill_hrs_per_part, part.brakepress_hrs_per_part) " 
      + "FROM Po po " 
      + "LEFT JOIN po.partList po_part " 
      + "LEFT JOIN po_part.part part " 
      + "LEFT JOIN po_part.part where po.id = :id") 
    List<ShopOrder> getShopOrder(long id); 

Bây giờ tôi đã cố gắng làm:

@Query("SELECT NEW com.htd.domain.ShopOrder(po.id, po.po_number, " 
      + "po.due_date, po_part.id, po_part.part_quantity, " 
      + "part.id, part.part_number, part.part_description, " 
      + "part.plasma_hrs_per_part, part.grind_hrs_per_part, " 
      + "part.mill_hrs_per_part, part.brakepress_hrs_per_part) " 
      + "FROM Po po " 
      + "LEFT JOIN po.partList po_part " 
      + "LEFT JOIN po_part.part part " 
      + "LEFT JOIN po_part.part where po.id = :id") 
    List<ShopOrder> getShopOrder(@Param(value="id")); 

Nhưng điều này đem lại cho tôi một lời cảnh báo rằng:

[ERROR] org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]. 
[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in 
context with path [] threw exception [Request processing failed; nested 
exception is org.springframework.dao.InvalidDataAccessApiUsageException: 
Name for parameter binding must not be null or empty! For named parameters 
you need to use @Param for query method parameters on Java versions < 8.; 
nested exception is java.lang.IllegalArgumentException: Name for parameter 
binding must not be null or empty! For named parameters you need to use 
@Param for query method parameters on Java versions < 8.] with root cause 
java.lang.IllegalArgumentException: Name for parameter binding must not be 
null or empty! For named parameters you need to use @Param for query method 
parameters on Java versions < 8. 

Phương pháp được thực hiện các truy vấn là:

/** 
    * Generate Shop Orders. 
    */ 
    @RequestMapping(value = "/generateShopOrder/{id}", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE) 
    @Timed 
    public void generate(@PathVariable Long id) throws URISyntaxException { 
     System.out.println("po id to generate = " + id); 

     List<ShopOrder> shopOrders = po_partRepository.getShopOrder(id); 

     for(ShopOrder order: shopOrders) { 
      System.out.println("-------Printing Shop Orders" + order); 
     } 

    } 

Tư vấn?

CẬP NHẬT ------------ ----------------

Điều này dường như để khắc phục vấn đề:

@Query("SELECT NEW com.htd.domain.ShopOrder(po.id, po.po_number, " 
      + "po.due_date, po_part.id, po_part.part_quantity, " 
      + "part.id, part.part_number, part.part_description, " 
      + "part.plasma_hrs_per_part, part.grind_hrs_per_part, " 
      + "part.mill_hrs_per_part, part.brakepress_hrs_per_part) " 
      + "FROM Po po " 
      + "LEFT JOIN po.partList po_part " 
      + "LEFT JOIN po_part.part part " 
      + "LEFT JOIN po_part.part where po.id = ?1") 
    List<ShopOrder> getShopOrder(Long id); 

Tuy nhiên bây giờ tôi nhận được một lỗi nói:

[ERROR] org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]. 
[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in 
context with path [] threw exception [Request processing failed; nested 
exception is org.springframework.dao.InvalidDataAccessApiUsageException: 
org.hibernate.QueryException: could not instantiate class 
[com.htd.domain.ShopOrder] from tuple; nested exception is 
java.lang.IllegalArgumentException: org.hibernate.QueryException: could not 
instantiate class [com.htd.domain.ShopOrder] from tuple] with root cause 
java.lang.IllegalArgumentException: null 

ShopOrder:

public ShopOrder(long po_id, String po_number, LocalDate po_due_date, 
    long po_part_id, int part_quantity, long part_id, 
    String part_number, String part_decription, BigDecimal plasma_hrs, 
    BigDecimal grind_hours, BigDecimal mill_hrs, 
    BigDecimal breakpress_hrs) { 

     this.po_id = po_id; 
     this.po_number = po_number; 
     this.po_due_date = po_due_date; 
     this.po_part_id = po_part_id; 
     this.part_quantity = part_quantity; 
     this.part_id = part_id; 
     this.part_number = part_number; 
     this.part_decription = part_decription; 
     this.plasma_hrs = plasma_hrs; 
     this.grind_hours = grind_hours; 
     this.mill_hrs = mill_hrs; 
     this.breakpress_hrs = breakpress_hrs; 

    } 

Database tables

+0

GÌ cung cấp cho bạn các lỗi? Điều gì ném ngoại lệ? stack trace? –

+0

@NeilStockton trả lời cập nhật với dấu vết ngăn xếp đầy đủ – Drew1208

+0

@NeilStockton xem cập nhật .... – Drew1208

Trả lời

10

Thay vì sử dụng: po.id =: id chỉ cần sử dụng 1 ....

@Query("SELECT NEW com.htd.domain.ShopOrder(po.id, po.po_number, " 
      + "po.due_date, po_part.id, po_part.part_quantity, " 
      + "part.id, part.part_number, part.part_description, " 
      + "part.plasma_hrs_per_part, part.grind_hrs_per_part, " 
      + "part.mill_hrs_per_part, part.brakepress_hrs_per_part) " 
      + "FROM Po po " 
      + "LEFT JOIN po.partList po_part " 
      + "LEFT JOIN po_part.part part " 
      + "LEFT JOIN po_part.part where po.id = ?1") 
    List<ShopOrder> getShopOrder(Long id); 
45

Hãy thử điều này mô tả thông số:

List<ShopOrder> getShopOrder(@Param("id") long id); 
+3

Tôi thấy thật lạ khi JPA không cho phép thẻ @Param không có giá trị để sử dụng tên param mặc định giống như tên biến. –

+1

@AmrinderArora Vì tên biến không truy cập được –

+1

@ er-han Có, nhưng chắc chắn là _can_. Ví dụ: https://stackoverflow.com/questions/40526925/why-are-spring-data-repository-method-parameters-names-not-available-even-on-jav?noredirect=1&lq=1 –

Các vấn đề liên quan