如何使用下一个序列号设置插件到grails创建的文件?

时间:2010-05-12 20:44:07

标签: sql postgresql grails

我正在使用JMS队列读取数据并将数据插入由grails创建的postgres表中。问题是获得下一个序列值。我以为我已经找到了以下语句的解决方案(通过将“DEFAULT”放在ID应该去​​的地方),但它已经不再有效了。我必须改变一些东西,因为我需要重新创建表格。解决这个问题的最佳方法是什么?

ps = c.prepareStatement(“INSERT INTO xml_test(id,version,xml_text) VALUES(DEFAULT,0,?)“);

更新:

根据建议的解决方案,我做了以下事情:

将此添加到域:

class XmlTest {
    String xmlText
    static constraints = {
        id generator:'sequence', params:[name:'xmltest_sequence']
    }
}

并将insert语句更改为以下内容:

ps = c.prepareStatement("INSERT INTO xml_test (id, version, xml_text) 
VALUES (nextval('xmltest_sequence'), 0, ?)");

但是,当我运行该语句时,我收到以下错误:

[java] 1 org.postgresql.util.PSQLException:错误:关系“xmltest_sequence”不存在

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用nextval函数获取PostgreSQL中任何序列的值,在您的情况下:

INSERT INTO xml_test (id, version, xml_text) VALUES (nextval('sequence_name_for_this_table'), 0, ?);

在您的grails域类中,您可以选择序列名称:

static mapping = {
    id generator:sequence, params:[name:'sequence_name_for_this_table']
}

答案 1 :(得分:1)

问题解决了。

事实证明,当grails创建表时,它不会为其分配特定的序列生成器。

相反,grails为所有表使用单个序列生成器。这称为“hibernate_sequence”。

因此,为了解决这个问题,我在SQL语句中包含了“nextval”:

ps = c.prepareStatement(“INSERT INTO xml_test(id,version,text_field)VALUES(nextval('hibernate_sequence'),0,?););