通过PostgreSQL DB上的简单java Query获取nextval序列值

Que*_* T. 2 postgresql hibernate hql

我正在研究PostgreSQL数据库,我试图nextval通过简单的Java查询来恢复序列,但是它不起作用:

  Query q = entityManager.createQuery("SELECT nextval(numcallcartnewcart) as num");
    BigDecimal result=(BigDecimal)q.getSingleResult();   
    return result.longValue();
Run Code Online (Sandbox Code Playgroud)

(当然它不是最好的解决方案,但是我不能做得更好,因为我被Hibernate配置阻止了复合id标签,它不接受这样的生成器序列:

        <column name="num_call" />
             <generator class="sequence">
                    <param name="sequence">numcallcartnewcart</param>
             </generator>
Run Code Online (Sandbox Code Playgroud)

进入key-property标签:

   <key-property name="numCall" type="int">
    <column name="num_call"/>
   </key-property>
Run Code Online (Sandbox Code Playgroud)

)以下是Query的错误:

 \-[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)
Run Code Online (Sandbox Code Playgroud)

它与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)
Run Code Online (Sandbox Code Playgroud)

编辑:报价

Query q = entityManager.createNativeQuery("SELECT nextval('numcallcartnewcart') as num");

        BigDecimal result=(BigDecimal)q.getSingleResult();   
        return result.longValue();
Run Code Online (Sandbox Code Playgroud)

-

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)
Run Code Online (Sandbox Code Playgroud)

编辑2 :(问题是我的数据库中没有序列(不是好的...)

我们必须使用BigInteger,而不是BigDecimal,并使用序列名称周围的引号:

    Query q = entityManager.createNativeQuery("SELECT nextval('numcallcartnewcart') as num");
    BigInteger result=(BigInteger)q.getSingleResult();   
    return result.longValue(); 
Run Code Online (Sandbox Code Playgroud)

a_h*_*ame 7

序列的名称必须作为字符串文字传递,而不是作为标识符传递:

entityManager.createQuery("SELECT nextval('numcallcartnewcart') as num");
Run Code Online (Sandbox Code Playgroud)

手册中的更多细节:http://www.postgresql.org/docs/current/static/functions-sequence.html

编辑

错误

ERREUR:la relationship«numcallcartnewcart»n'existe pas

表示不numcallcartnewcart存在具有该名称的序列.您需要先创建序列.