我有psql中的序列使用的函数,用uid_number从1000到11000填充 user_ext 表中的新记录,当我有10000条记录时我需要抛出某种异常并且我试图再添一个。
我在DB中这样做了:
CREATE OR REPLACE FUNCTION uid_func(_seq regclass)
RETURNS integer AS
$func$
BEGIN
IF (SELECT COUNT(uid_number) FROM user_ext)>=10000 THEN
RAISE EXCEPTION 'Uid numbers pool has been exhausted';
ELSE
LOOP
PERFORM nextval(_seq);
EXIT WHEN NOT EXISTS (SELECT 1000 FROM user_ext WHERE uid_number = lastval());
END LOOP;
RETURN lastval();
END IF;
END
$func$ LANGUAGE plpgsql VOLATILE;
接下来我需要在JPA DAO中捕获此错误。 在Java中,我使用了一些函数(recalculateUsers),它通过NativeQuery将记录添加到 user_ext 表中,因此当recalculateUsers无法添加其他记录时,应抛出异常并稍后在java中处理。
我的问题是:如何在我的DAO中捕获RAISE EXCEPTION?
我试过了:
catch (SQLException ex) {
但我得到了
SQLException is never thrown in the corresponding try block
这是我DAO中的方法:
public void refreshUsersPrivileges(List<String> userNames) {
try {
em.flush();
Query query = em.createNativeQuery("SELECT cast(recalculateUsers(?) AS text)");
query.setParameter(1, StringUtils.join(userNames, "|"));
query.getSingleResult();
} catch (PersistenceException ex) {
throw new InternalUnexpectedException(GENERIC_DAO_COMPONENT, MessageUtil.getMessage(USER_MESSAGE_BUNDLE,
"Common.UserMessage.InternalUnexpectedException.UnexpectedCondition"), ex);
} catch (SQLException ex) {
final String ss = ex.getMessage();
if (ss.equals("Uid numbers pool has been exhausted")) {
throw new InternalUnexpectedException(GENERIC_DAO_COMPONENT, MessageUtil.getMessage(USER_MESSAGE_BUNDLE,
"Common.UserMessage.InternalUnexpectedException.UnexpectedCondition"), ex);
}
}
}