hibernate - 通过 PostgreSQL 数据库上的简单 java 查询获取 nextval 序列值

标签 hibernate postgresql hql

我正在处理 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 的序列。您需要先创建序列。

关于hibernate - 通过 PostgreSQL 数据库上的简单 java 查询获取 nextval 序列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29678640/

相关文章:

hibernate - 为类 classname 提供了错误类型的 id 预期为 : class java. lang.Integer,得到了类 java.lang.String

java - Hibernate多实体连接问题,产生额外查询

sql - Postgres 外键链

java - 左加入 hql 中的第一场比赛

hibernate - HQL:一个集合的元素是否在另一个集合中?

java - 由于 MS SQL 中 UNIQUE 约束的非标准行为,Spring/Hibernate 的解决方法

java - 禁用 Hibernate 批处理

postgresql - 在 postgres 中的子句

postgresql - Postgres ODBC 驱动模块

sql - Grails HQL 与 SQL 语句