JPA 2.1存储过程getOutputParameterValue()返回不正确的数据类型

时间:2016-06-05 20:15:20

标签: java mysql stored-procedures ejb-3.1 jpa-2.1

我有这个存储过程:

var localStorage = window.localStorage

var storedUsername = getUsernameInMemory()
var domUsername = getUsernameDomValue()

var username = storedUsername || domUsername || 'unknown'

if ( !isUsernameDefinedInDOM() ) {
  setLoginname(username)
}
if ( isUsernameKnown() && !isUsernameDefinedInLocalStorage() ) {
  storeUsername(username)
}

function isUsernameKnown () {
  return username !== 'unknown'
}
function setLoginname (_username) {
  document.getElementById('loginname').innerHTML = username
}
function storeUsername (_username) {
  localStorage['username'] = _username
}
function getUsernameDomValue () {
  return document.getElementById('username').value
}
function getUsernameInMemory () {
  return localStorage['username']
}
function isUsernameDefinedInDOM () {
  return !!getUsernameDomValue() // returns a boolean
}
function isUsernameDefinedInLocalStorage () {
  return getUsernameDomValue() !== 'unknown'
}


我在我的EJB实体中注释了这样的内容:

CREATE PROCEDURE `pct_getNextMenuId` (IN venueId INT UNSIGNED, OUT menuId TINYINT UNSIGNED)
BEGIN
    UPDATE Venues SET lastSeqIdMenus = LAST_INSERT_ID(lastSeqIdMenus + 1) WHERE  id=venueId LIMIT 1;
    SELECT LAST_INSERT_ID() INTO menuId;
END


现在尝试在我的Java代码中使用它:

@NamedStoredProcedureQueries( {
    @NamedStoredProcedureQuery(name="getNextMenuId", procedureName="pct_getNextMenuId", parameters={
        @StoredProcedureParameter(name="venueId", type=Long.class, mode=ParameterMode.IN),
        @StoredProcedureParameter(name="menuId", type=Short.class, mode=ParameterMode.OUT)}
    )
})

问题是StoredProcedureQuery query = em.createNamedStoredProcedureQuery("getNextMenuId"); query.setParameter("venueId", venueId); query.execute(); Short menuId = (Short) query.getOutputParameterValue("menuId"); 似乎忽略了query.getOutputParameterValue("menuId")注释并因某种原因返回 Long ,最终会抛出 ClassCastException 我正在施展 Short

我做错了什么或是个错误?我使用EclipseLink 2.5.0浏览Glassfish 4。我也尝试将其更新为2.6.4,但我得到了同样的行为。我尝试使用type=Short.class注释menuId,但也会被忽略,我仍然会得到 Long

我显然可以type=String.class继续前进,但我使用了几个存储过程,并且我希望这样做能够在没有黑客的情况下正常工作。

顺便说一下,我没有使用标准的 AutoIncrement ,因为表菜单有一个复合PK (venueId INT UNSIGNED,menuId TINYINT UNSIGNED)

谢谢!

0 个答案:

没有答案