通过对 PostgreSQL 数据库的简单 java 查询获取 nextval 序列值
Get nextval sequence value by simple java Query on a PostgreSQL DB
我正在使用 PostgreSQL 数据库,我正在尝试通过 Java 的简单查询来恢复 nextval
序列,但它不起作用:
Query q = entityManager.createQuery("SELECT nextval(numcallcartnewcart) as num");
BigDecimal result=(BigDecimal)q.getSingleResult();
return result.longValue();
(当然这不是最好的解决方案,但我不能做得更好,因为我被带有 composite-id 标签的 Hibernate 配置阻止了,它不接受这样的生成器序列:
<column name="num_call" />
<generator class="sequence">
<param name="sequence">numcallcartnewcart</param>
</generator>
进入关键-属性标签:
<key-property name="numCall" type="int">
<column name="num_call"/>
</key-property>
)
这是查询的错误:
\-[METHOD_CALL] MethodNode: '('
+-[METHOD_NAME] IdentNode: 'nextval' {originalText=nextval}
\-[EXPR_LIST] SqlNode: 'exprList'
\-[IDENT] IdentNode: 'numcallcartnewcart' {originalText=numcallcartnewcart}
at org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:154)
at org.hibernate.hql.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:845)
at org.hibernate.hql.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:633)
它与 createNativeQuery 大致相同(但不是相同的错误):
Caused by: org.postgresql.util.PSQLException: ERROR: column « numcallcartnewcart » does not exist
Position: 16
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2101)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1834)
编辑:引用
Query q = entityManager.createNativeQuery("SELECT nextval('numcallcartnewcart') as num");
BigDecimal result=(BigDecimal)q.getSingleResult();
return result.longValue();
--
Caused by: org.postgresql.util.PSQLException: ERREUR: la relation « numcallcartnewcart » n'existe pas
Position: 16
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2101)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1834)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
编辑 2:(问题是我的数据库中没有序列(不是好的序列...)
而且我们必须使用 BigInteger,而不是 BigDecimal,并在序列名称周围使用引号:
Query q = entityManager.createNativeQuery("SELECT nextval('numcallcartnewcart') as num");
BigInteger result=(BigInteger)q.getSingleResult();
return result.longValue();
序列的名称必须作为字符串文字而不是标识符传递:
entityManager.createQuery("SELECT nextval('numcallcartnewcart') as num");
手册中的更多详细信息:http://www.postgresql.org/docs/current/static/functions-sequence.html
编辑
错误
ERREUR: la relation « numcallcartnewcart » n'existe pas
表示不存在名称为numcallcartnewcart
的序列。您需要先创建序列。
我正在使用 PostgreSQL 数据库,我正在尝试通过 Java 的简单查询来恢复 nextval
序列,但它不起作用:
Query q = entityManager.createQuery("SELECT nextval(numcallcartnewcart) as num");
BigDecimal result=(BigDecimal)q.getSingleResult();
return result.longValue();
(当然这不是最好的解决方案,但我不能做得更好,因为我被带有 composite-id 标签的 Hibernate 配置阻止了,它不接受这样的生成器序列:
<column name="num_call" />
<generator class="sequence">
<param name="sequence">numcallcartnewcart</param>
</generator>
进入关键-属性标签:
<key-property name="numCall" type="int">
<column name="num_call"/>
</key-property>
) 这是查询的错误:
\-[METHOD_CALL] MethodNode: '('
+-[METHOD_NAME] IdentNode: 'nextval' {originalText=nextval}
\-[EXPR_LIST] SqlNode: 'exprList'
\-[IDENT] IdentNode: 'numcallcartnewcart' {originalText=numcallcartnewcart}
at org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:154)
at org.hibernate.hql.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:845)
at org.hibernate.hql.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:633)
它与 createNativeQuery 大致相同(但不是相同的错误):
Caused by: org.postgresql.util.PSQLException: ERROR: column « numcallcartnewcart » does not exist
Position: 16
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2101)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1834)
编辑:引用
Query q = entityManager.createNativeQuery("SELECT nextval('numcallcartnewcart') as num");
BigDecimal result=(BigDecimal)q.getSingleResult();
return result.longValue();
--
Caused by: org.postgresql.util.PSQLException: ERREUR: la relation « numcallcartnewcart » n'existe pas
Position: 16
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2101)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1834)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:255)
编辑 2:(问题是我的数据库中没有序列(不是好的序列...)
而且我们必须使用 BigInteger,而不是 BigDecimal,并在序列名称周围使用引号:
Query q = entityManager.createNativeQuery("SELECT nextval('numcallcartnewcart') as num");
BigInteger result=(BigInteger)q.getSingleResult();
return result.longValue();
序列的名称必须作为字符串文字而不是标识符传递:
entityManager.createQuery("SELECT nextval('numcallcartnewcart') as num");
手册中的更多详细信息:http://www.postgresql.org/docs/current/static/functions-sequence.html
编辑
错误
ERREUR: la relation « numcallcartnewcart » n'existe pas
表示不存在名称为numcallcartnewcart
的序列。您需要先创建序列。