This has been posted before but my issue is a little different. This is the JPQL query in question:
@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);
Now I did try to do:
@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"));
But this giving me a warning saying:
[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.
The method that is executing the query is:
/** * 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); } }
Advice?
------------UPDATE----------------
This seemed to fix the issue:
@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);
However now I am getting an error saying:
[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; }
Hence it is suggested to use @Param annotation in the method parameter to bind the query parameter names. And in the query, you need to use :paramName to indicate that the same paramName is to bind with the method parameter.
We can also pass method parameters to the query using named parameters. We define these using the @Param annotation inside our repository method declaration. Each parameter annotated with @Param must have a value string matching the corresponding JPQL or SQL query parameter name.
Try this parameter description:
List<ShopOrder> getShopOrder(@Param("id") long id);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With