【问题标题】:How to get next id in GRAILS?如何在 GRAILS 中获取下一个 ID?
【发布时间】:2012-03-15 22:20:03
【问题描述】:

我需要使用 GORM 或本机查询来获取序列中的下一个可用 id。 我该怎么做?

我正在使用 oracle。


更新:

我需要这个值BEFORE插入,因为我的行将使用这个值。 我有一个名为 IMAGE 的表,其中包含 FILE_NAME 列,如下所示:

- ID | FILE_NAME
- 123 | foo_bar_123.png
- 124 | xxx_yyy_124.png

非常感谢。

【问题讨论】:

    标签: oracle grails plsql grails-orm


    【解决方案1】:

    为什么在插入之前需要值?您能否使用RETURNING 子句将信息作为插入的一部分,即

    INSERT INTO table_name( id, file_name )
      VALUES( some_sequence.nextval, <<bind variable>> )
      RETURNING id INTO <<bind variable>>
    

    或者在插入之后使用

    SELECT sequence_name.currval
      FROM dual
    

    序列的currval 返回当前会话中生成的序列的最新值,因此它实际上是线程安全的。由于序列旨在在高度并发的环境中提供数字,因此您通常无法找出nextval 将是什么,除非您实际获取nextval。即使可以,也不能保证不会出现另一个线程并获得您在INSERT 发生之前查看的值,因此在多用户中查看nextval 是不安全的环境。

    【讨论】:

    • 我试过 nextval。 Grails 也使用 nextval,所以我害怕总是得到 id + 2,而不是 id + 1。示例:1、3、5、7...但我想要:1、2、3、4
    【解决方案2】:

    我改编了@Cave 提示。 所以,我的解决方案是:

    从以下位置更改我的映射:

    class Image {
    ...
    id column: "ID", generator: "sequence", params: [sequence:"MY_SEQUENCE"]
    ...
    }
    

    到:

    class Image {
    ...
    id column: "ID", generator: "assigned"
    ...
    }
    

    并使用以下方法手动设置 id:

    def getLastImageId(){
      def sql = "SELECT MY_SEQUENCE.nextval FROM dual"
      def query = sessionFactory.currentSession.createSQLQuery(sql);
      def result = query.list()
      return result[0]
    }
    ...
    newImage.id = getLastImageId()
    newImage.fileName = "foo_bar_${newImage.id}.png"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 2011-10-09
      • 2020-01-29
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多