猿问

Java Spring Boot 项目中的存储过程返回 null 作为输出

我在 Spring Boot 项目中使用存储过程并尝试获取输出值,但在我的项目中它总是返回 null。但是,如果我通过 HeidiSQL 调用该过程,它会起作用并为我提供正确的值。


所以它必须用我的java代码做一些事情。我调试了受影响的方法,但找不到返回 null 的原因。


我已经尝试查找其他帖子,但找不到与我的特定问题相匹配的内容。


这是我尝试使用存储过程的方法:


公司资源服务实现


@Service

public class CompanyResourceServiceImpl implements CompanyResourceService {


@PersistenceContext

    private EntityManager entityManager;


...


private int getMetalResourceByPlayerId(int theId) {


        StoredProcedureQuery theQuery = entityManager.createStoredProcedureQuery("getAllMetalFromCompaniesByPlayerId");


        theQuery.registerStoredProcedureParameter(1, Integer.class, ParameterMode.IN);

        theQuery.registerStoredProcedureParameter(2, BigDecimal.class, ParameterMode.OUT);


        theQuery.setParameter(1, theId);


        theQuery.execute();


        BigDecimal outAmount = (BigDecimal) theQuery.getOutputParameterValue(2);


        return outAmount.intValue();

    }


...


}

以下是存储过程:


getAllMetalFromCompaniesByPlayerId


CREATE DEFINER=`root`@`localhost` PROCEDURE `getAllMetalFromCompaniesByPlayerId`(

    IN `playerId` INT,

    OUT `metalSum` DECIMAL(19,2)

)

LANGUAGE SQL

NOT DETERMINISTIC

CONTAINS SQL

SQL SECURITY DEFINER

COMMENT ''

BEGIN

SELECT sum(cr.amount) as metalSum

FROM company_resource cr

JOIN company c ON (c.id = cr.company_id) WHERE c.player_id = playerId and cr.resource_id = 1;

END

我的目标是获取输出值并在@Scheduled方法中使用它。正如我所说,在 HeidiSQL 中,存储过程有效。


Qyouu
浏览 175回答 1
1回答

跃然一笑

经过几个小时的尝试,我找到了一种让它工作的方法。首先我添加@NamedStoredProcedureQuery到我的CompanyResource实体类:CompanyResource.java@Entity@Table(name = "company_resource")@NamedStoredProcedureQueries({        @NamedStoredProcedureQuery(name = "getAllMetalFromCompaniesByPlayerId",                                    procedureName = "getAllMetalFromCompaniesByPlayerId",                                    parameters = {                                        @StoredProcedureParameter(mode = ParameterMode.IN, name = "playerId", type = Integer.class),                                        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "metalSum", type = BigDecimal.class)                                    })})@IdClass(CompanyResourcePK.class)public class CompanyResource {...}然后我改变了我的getMetalResourceByPlayerId()方法CompanyResourceServiceImpl如下:CompanyResourceServiceImpl.java@Servicepublic class CompanyResourceServiceImpl implements CompanyResourceService {@PersistenceContext    private EntityManager entityManager;...private int getMetalResourceByPlayerId(int theId) {        StoredProcedureQuery theQuery = entityManager.createNamedStoredProcedureQuery("getAllMetalFromCompaniesByPlayerId");        theQuery.setParameter("Param1", theId);        BigDecimal outAmount = (BigDecimal) theQuery.getSingleResult();        return  outAmount.intValue();    }...}
随时随地看视频慕课网APP

相关分类

Java
我要回答