我有这个存储过程:
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)
谢谢!