Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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 调用存储过程时返回相同的记录_Java_Spring Boot_Hibernate - Fatal编程技术网

Java 调用存储过程时返回相同的记录

Java 调用存储过程时返回相同的记录,java,spring-boot,hibernate,Java,Spring Boot,Hibernate,我有一个mysql数据库(稍后我还需要在MSSQL上运行它),带有一个名为aa_acme_的存储过程,它接受一个序列号参数。我可以在mysql中调用它,如下所示: call aa_acme_consumables("12345"); @Entity @Data public class Consumable implements Serializable { @Id @Column(name = "Serial_No") pri

我有一个mysql数据库(稍后我还需要在MSSQL上运行它),带有一个名为aa_acme_的存储过程,它接受一个序列号参数。我可以在mysql中调用它,如下所示:

call aa_acme_consumables("12345");
@Entity
@Data
public class Consumable implements Serializable {

    @Id
    @Column(name = "Serial_No")
    private String serialNo;
    @Column(name = "partID")
    private String partID;
    @Column(name = "Qty")
    private int quantity;
    @Column(name = "Description")
    private String desc;    
}
public class ConsumableRepoImpl {

    @PersistenceContext
    EntityManager em;
    
    public List<Consumable> getAllConsumables(String serialNum) throws SQLException {
        
        StoredProcedureQuery query = em.createStoredProcedureQuery("xx_bds_Consumable", Consumable.class);
        query.registerStoredProcedureParameter("serialNum", String.class, ParameterMode.IN);
        query.setParameter("serialNum", serialNum);
        
        query.execute();
        
        List<Consumable> consumableList = query.getResultList();
        
        for (Consumable c : consumableList ) {
            System.out.println("Description : " + c.getDesc() );
        }
                
        return consumableList ;
    }
}
我将返回以下记录:

Serial_No | partID | Qty | Description
12345     | a123   | 10  | Widget One
12345     | b456   | 3   | Widget Two
========== ABOUT TO RUN STORED PROC ==========
Hibernate: {call aa_acme_consumables(?)}
Description : Widget One
Description : Widget Two
充分披露:在我的多次尝试中,我可能会混淆不同解决方案的部分内容。这是我到目前为止所拥有的

我的@实体类如下所示:

call aa_acme_consumables("12345");
@Entity
@Data
public class Consumable implements Serializable {

    @Id
    @Column(name = "Serial_No")
    private String serialNo;
    @Column(name = "partID")
    private String partID;
    @Column(name = "Qty")
    private int quantity;
    @Column(name = "Description")
    private String desc;    
}
public class ConsumableRepoImpl {

    @PersistenceContext
    EntityManager em;
    
    public List<Consumable> getAllConsumables(String serialNum) throws SQLException {
        
        StoredProcedureQuery query = em.createStoredProcedureQuery("xx_bds_Consumable", Consumable.class);
        query.registerStoredProcedureParameter("serialNum", String.class, ParameterMode.IN);
        query.setParameter("serialNum", serialNum);
        
        query.execute();
        
        List<Consumable> consumableList = query.getResultList();
        
        for (Consumable c : consumableList ) {
            System.out.println("Description : " + c.getDesc() );
        }
                
        return consumableList ;
    }
}
我的存储库类如下所示“

因此,我的问题是: **我为什么要退货**

========== ABOUT TO RUN STORED PROC ==========
Hibernate: {call aa_acme_consumables(?)}
Description : Widget One
Description : Widget One

我希望从第二条记录(小部件二)中获得描述返回的结果就像我从mysql调用存储的进程一样,但是我得到了两次Widget One。这已经让我头疼了。

不确定这是否是根本问题,但是
序列号在示例结果中不是唯一的,所以它可能不应该被标记为
@Id
。也许
PartId
应该是
@Id?你们这些家伙总是让我惊讶不已……非常感谢。我把@Id改成了描述(这对于这个测试来说应该是唯一的),我得到了我期望的结果。