参数绑定的名称不能为null或为空! 对于命名参数,您需要在Java版本上使用@Param作为查询方法参数

这已经发布过,但我的问题有点不同。 这是有问题的JPQL查询:

@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 getShopOrder(long id); 

现在我确实尝试过:

 @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 getShopOrder(@Param(value="id")); 

但这给了我一个警告:

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

执行查询的方法是:

  /** * 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 shopOrders = po_partRepository.getShopOrder(id); for(ShopOrder order: shopOrders) { System.out.println("-------Printing Shop Orders" + order); } } 

建议吗?

———— UPDATE —————-

这似乎解决了这个问题:

 @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 getShopOrder(Long id); 

但是现在我收到一个错误说:

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

数据库表

试试这个参数说明:

 List getShopOrder(@Param("id") long id); 

而不是使用:po.id =:id只使用?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 getShopOrder(Long id);