Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JPQL中使用NEW时未初始化列表_Java_Jpa_Jpql - Fatal编程技术网

Java 在JPQL中使用NEW时未初始化列表

Java 在JPQL中使用NEW时未初始化列表,java,jpa,jpql,Java,Jpa,Jpql,我有一个相当简单的查询,它接受一些表的输入。当我尝试运行查询时,它会显示: [ERROR] org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]. [dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing fai

我有一个相当简单的查询,它接受一些表的输入。当我尝试运行查询时,它会显示:

[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
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 = ?1")
    List<ShopOrder> getShopOrder(Long id);
我创建了一个Juint测试,通过执行以下操作来查看发生了什么:

@Test
@Transactional
public void shopOrderTest() throws Exception
{

        Po po = new Po();
        Long id = (long) 11;
        LocalDate date = new LocalDate(2015,6,10);
        po.setDue_date(date);
        po.setId(id);
        po.setPo_number("11254");
        po.setSales_order_number("34879");
        po.setStatus("ordered");
        BigDecimal total_sale = new BigDecimal("55");
        po.setTotal_sale(total_sale);

        Part part = new Part();
        BigDecimal brakepress_hrs_per_part = new BigDecimal("34");
        part.setBrakepress_hrs_per_part(brakepress_hrs_per_part);
        BigDecimal grind_hrs_per_part = new BigDecimal("354");
        part.setGrind_hrs_per_part(grind_hrs_per_part);
        part.setId(id);
        part.setInventory_count(55);
        BigDecimal laser_hrs_per_part = new BigDecimal("987");
        part.setLaser_hrs_per_part(laser_hrs_per_part);
        BigDecimal lb_per_part = new BigDecimal("58748");
        part.setLb_per_part(lb_per_part);

        poRes.save(po);
        partRes.save(part);

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

        int size = getOrders.size();

        System.out.println("The size is-----"+size);

        for(ShopOrder order: getOrders){
            System.out.println(order);
        }
    }

}
我希望这能澄清我的疑问。如果你对我应该如何做一个更好的查询有任何建议,我洗耳恭听

下面是我的数据库表的图片:

@Query("SELECT NEW com.htd.domain.ShopOrder(pp.po.id, pp.po.po_number, pp.po.due_date, pp.id, pp.part_quantity, "
        + "pp.part.id, pp.part.part_number, pp.part.part_description, pp.part.plasma_hrs_per_part, pp.part.grind_hrs_per_part, "
        + "pp.part.mill_hrs_per_part, pp/part.brakepress_hrs_per_part) "
        + "FROM Po_part pp Where pp.part.id = ?1")
List<ShopOrder> getShopOrder(Long id);

@Query(“选择新的com.htd.domain.ShopOrder(pp.po.id,pp.po.po\u编号,pp.po.due\u日期,pp.id,pp.part\u数量,”
+“pp.part.id、pp.part.part\u编号、pp.part.part\u描述、pp.part.plasma\u hrs\u每个零件、pp.part.grind\u每个零件,”
+pp.part.mill每个零件工时,pp/part.brakepress每个零件工时)
+“来自Po_零件pp,其中pp.part.id=?1”)
列出getShopOrder(长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_part po_part ON po_part.po.id = po.id"
        + "LEFT JOIN Part part ON po_part.part.id = part.id AND po.part.id = ?1")
List<ShopOrder> getShopOrder(Long id);
@Query(“选择新的com.htd.domain.ShopOrder(采购订单编号、采购订单编号、采购订单到期日期、采购订单零件编号、采购订单零件数量,”
+零件号、零件号、零件号、零件说明、零件号、零件号、零件号、零件号、零件号、零件号
+“零件轧机每零件工时,零件制动器每零件工时”
+“来自Po Po”
+“在Po_part.Po.id=Po.id上左连接Po_part Po_part”
+“在po_Part.Part.id=Part.id和po.Part.id=1上左连接零件”
列出getShopOrder(长id);

在方法中使用Left join

时,您正在测试
shopOrders
是否为null,但随后您使用的是
shopOrders.toString()
,这将导致NPE。但这并不是你的查询失败的原因。您的查询被保留两次。这有什么原因吗?此外,是否有可能不存在任何连接关系?如果是这样的话,你可能想让他们加入,而不是左加入。还有,“这起作用了!!!!”消息的相关性是什么?@DuncanKinnear我已经更新了我的帖子。我希望这能把事情弄清楚。@DuncanKinnear我删除了“它起作用了!!!!”的消息。这只是为了调试的目的,我在上传这篇文章之前忘了删除它。你还没有说为什么你在查询中两次
离开了JOIN po_part.part
。尝试删除紧靠
where
前面的第二个。
@OneToMany(mappedBy="po",targetEntity=Po_part.class)
private List<Po_part> partList;


public List<Po_part> getPartList() {
    return partList;
}
@OneToMany(mappedBy="part",targetEntity=Po_part.class)
private List<Po_part> partList;
@ManyToOne
private Part part;

@ManyToOne
private Po po;
@Query("SELECT NEW com.htd.domain.ShopOrder(pp.po.id, pp.po.po_number, pp.po.due_date, pp.id, pp.part_quantity, "
        + "pp.part.id, pp.part.part_number, pp.part.part_description, pp.part.plasma_hrs_per_part, pp.part.grind_hrs_per_part, "
        + "pp.part.mill_hrs_per_part, pp/part.brakepress_hrs_per_part) "
        + "FROM Po_part pp Where pp.part.id = ?1")
List<ShopOrder> 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_part po_part ON po_part.po.id = po.id"
        + "LEFT JOIN Part part ON po_part.part.id = part.id AND po.part.id = ?1")
List<ShopOrder> getShopOrder(Long id);