2015-06-11 5 views
13

Questo è già stato pubblicato ma il mio problema è leggermente diverso. Questa è la query JPQL in questione:Il nome per il collegamento dei parametri non deve essere nullo o vuoto! Per i parametri denominati è necessario utilizzare @Param per i parametri del metodo di query nelle versioni 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); 

Ora ho provato a fare:

@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")); 

Ma questo mi dà un avvertimento dicendo:

[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. 

Il metodo che sta eseguendo il la domanda è:

/** 
    * 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); 
     } 

    } 

Consigli?

------------ UPDATE ----------------

Questo sembrava per risolvere il problema:

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

Comunque ora sto ottenendo un errore che dice:

[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

Che cosa ti dà l'errore? Cosa lancia l'eccezione? traccia dello stack? –

+0

@NeilStockton risposta aggiornata con traccia stack completo – Drew1208

+0

@NeilStockton vedere aggiornamento .... – Drew1208

risposta

10

Invece di utilizzare: po.id =: id basta usare 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

Prova questa descrizione dei parametri:?

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

Trovo strano che JPA non consenta il tag @Param senza un valore per utilizzare lo stesso nome param predefinito come nome della variabile. –

+1

@AmrinderArora Perché il nome della variabile non è accessibile –

+1

@ er-han Sì, ma sicuramente _can_ be. Ad esempio: https://stackoverflow.com/questions/40526925/why-are-spring-data-repository-method-parameters-names-not-available-even-on-jav?noredirect=1&lq=1 –

Problemi correlati