我有一个具有NON-ID字段的实体,必须从序列中设置.目前,我获取序列的第一个值,将其存储在客户端,并从该值进行计算.
但是,我正在寻找一种"更好"的方式来做到这一点.我已经实现了一种获取下一个序列值的方法:
public Long getNextKey()
{
Query query = session.createSQLQuery( "select nextval('mySequence')" );
Long key = ((BigInteger) query.uniqueResult()).longValue();
return key;
}
Run Code Online (Sandbox Code Playgroud)
但是,这种方式会显着降低性能(〜5000个对象的创建速度减慢了3倍 - 从5740ms减少到13648ms).
我试图添加一个"假"实体:
@Entity
@SequenceGenerator(name = "sequence", sequenceName = "mySequence")
public class SequenceFetcher
{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
private long id;
public long getId() {
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这种方法也不起作用(所有返回的Ids都是0).
有人可以告诉我如何有效地使用Hibernate获取下一个序列值吗?
编辑:经过调查,我发现调用的Query query = session.createSQLQuery( "select nextval('mySequence')" );效率远低于使用@GeneratedValue- 因为Hibernate 以某种方式设法减少访问所描述的序列时的提取次数@GeneratedValue.
例如,当我创建70,000个实体时(因此从同一序列中获取70,000个主键),我得到了我需要的一切.
但是,Hibernate只发出1404个 select nextval ('local_key_sequence') …
我在我的Codeigniter网站上使用PostgreSQL.我正在使用杂货店crud来添加,编辑和删除操作.在进行编辑或添加时,我想根据内容的ID动态重命名上传的文件.我可以使用杂货crud的callback_after_upload功能来做到这一点.
在添加新内容时,我想要内容的下一个ID.我尝试使用nextval()函数,但序列随之增加.如何在不使用nextval()函数的情况下获取序列的最后一个值?
或者有一种简单的方法可以做到这一点吗?
是否有简洁的方法在1个查询中多次为PostgreSQL序列选择nextval?这将是唯一返回的值.
例如,我想做一些非常短暂和甜蜜的事情:
SELECT NEXTVAL('mytable_seq', 3) AS id;
Run Code Online (Sandbox Code Playgroud)
得到:
id
-----
118
119
120
(3 rows)
Run Code Online (Sandbox Code Playgroud) 我有一个web api post方法,在我的Oracle数据库中的表中插入一个新行.我遇到了表的主键,这是一个序列值.我如何my_primary_key_seq.nextval在Entity Framework中做?目前此代码有效,但当通过旧的.net webform插入新行时,它将违反PK唯一约束,该webform使用序列下一个值作为下一个主键.
decimal nextPK = context.FORMPPs.OrderByDescending(p => p.PPID).FirstOrDefault().PPID + 1;
item.PPID = nextPK;
context.FORMPPs.Add(item);
int result = context.SaveChanges();
Run Code Online (Sandbox Code Playgroud) 我不得不从rails app上的基于mySql的ruby迁移到使用postgresql.到目前为止没有问题,但我不知道如何解决它.
数据的迁移带来了id,而postgresql现在遇到了现有ID的问题:我不清楚它在哪里获得用于确定nextval基数的值:它肯定不是最高值专栏,虽然您可能认为这是一个好主意.无论如何,它现在与现有的id值发生冲突.从标准RoR迁移创建的id列定义为
not null default nextval('geopoints_id_seq'::regclass)
Run Code Online (Sandbox Code Playgroud)
是否有一些地方可以将其作为基础使用的价值入侵?这个问题现在可能出现在20个左右的表格中:我可以使用
'select max(id) from <table_name>'
Run Code Online (Sandbox Code Playgroud)
但这似乎使自动增量柱的想法毫无意义.
如何最好地处理?
我有一个类映射为实体,以将其持久保存在数据库中.我有一个id字段作为主键,因此每次持久化对象时,都会从序列"myClass_pk_seq"中检索id的值,该代码类似于以下代码.
@Entity
@Table(name="myObjects")
public class MyClass {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="sequence")
@SequenceGenerator(name="sequence", sequenceName="myClass_pk_seq", allocationSize=1)
@Column(name="myClassId")
private Integer id;
private Integer code;
...
}
Run Code Online (Sandbox Code Playgroud)
我需要在"code"属性中创建类似于id的东西.我需要有一个序列,所以我可以为代码分配序列的下一个值(如果用户想要保留它但不保留数据,则保留该值).我的意思是用户将看到该字段,如果他不知道输入什么,他可以按下按钮并在屏幕上接收下一个可能的值(他可以接受或不接受).如何在不保留非主键字段的数据的情况下获取JPA中定义的序列的下一个值(并增加其值)?
我只想要一个方法在与"code"字段关联的序列上调用nextval,并返回该值.使用注释在JPA中执行此操作的最佳方法是什么?
谢谢.
在我的 postgreSQL DB 应用程序中,我有时需要在运行插入之前检索序列的下一个值。\n我曾经通过向我的用户授予对此类序列的 \xe2\x80\x9cusage\xe2\x80\x9d 权限来实现此目的并使用 \xe2\x80\x9cnextval\xe2\x80\x9d 函数。\n我最近开始使用 \xe2\x80\x9cGENERATED BY DEFAULT AS IDENTITY\xe2\x80\x9d 列作为主键,我仍然能够检索nextval 作为超级用户,但我无法将此类权限授予其他用户。我的错误在哪里\xe2\x80\x99?
\n\n这是一个例子:
\n\n-- <sequence>\nCREATE SEQUENCE public.apps_apps_id_seq\n INCREMENT 1\n START 1\n MINVALUE 1\n MAXVALUE 9223372036854775807\n CACHE 1;\n\nALTER SEQUENCE public.apps_apps_id_seq\n OWNER TO postgres;\n\nGRANT USAGE ON SEQUENCE public.apps_apps_id_seq TO udocma;\n\nGRANT ALL ON SEQUENCE public.apps_apps_id_seq TO postgres;\n-- </sequence>\n\n-- <table>\nCREATE TABLE public.apps\n(\n apps_id integer NOT NULL DEFAULT nextval(\'apps_apps_id_seq\'::regclass),\n apps_born timestamp without time zone NOT NULL DEFAULT now(),\n apps_vrsn character varying(50) COLLATE pg_catalog."default",\n apps_ipad character varying(200) COLLATE pg_catalog."default",\n apps_dscr character …Run Code Online (Sandbox Code Playgroud) 我正在使用c#.net 4.0并使用NHibernate与Oracle DB进行通信.你会想到一些简单的事情,因为这已经在某个地方得到了解决,但遗憾的是它没有.我需要Oracle序列中的NextVal.我不需要将其作为Id或主键的一部分插入数据库.我只需要在c#侧使用下一个val.
有人可以帮我解决xml映射和C#文件(或链接)来实现这一目标.
谢谢.
就像是
int NextValueOfSequence = GetNextValueofSequence();
public int GetNextValueOfSequence()
{
// Access NHibernate to return the next value of the sequence.
}
Run Code Online (Sandbox Code Playgroud) 我想为串行类型设置一些约束,它只产生偶数或奇数.
我有一张桌子。我在 plpgsql 中编写了一个函数,将一行插入到该表中:
INSERT INTO simpleTalbe (name,money) values('momo',1000) ;
Run Code Online (Sandbox Code Playgroud)
该表有serial一个名为 的字段id。我希望在插入行后在函数中知道新行收到的 id。
我想使用:
select nextval('serial');
Run Code Online (Sandbox Code Playgroud)
在插入之前,有没有更好的解决方案?
我创建下表
CREATE TABLE dogs (
id serial,
name VARCHAR(15),
age integer;
Run Code Online (Sandbox Code Playgroud)
我有这样的桌子
Table "public.birds"
Column | Type | Modifiers
---------+-----------------------+-------------------------------------
id | integer | not null default nextval('birds_id_seq'::regclass)
name | character varying(25) |
age | integer |
Run Code Online (Sandbox Code Playgroud)
我插入两行
INSERT INTO dogs (name, age)
VALUES ('puffy', 13),
('fluffy', 15);
Run Code Online (Sandbox Code Playgroud)
桌子现在看起来像这样
id | name | age
----+--------+-----
1 | puffy | 13
2 | fluffy | 15
(2 rows)
Run Code Online (Sandbox Code Playgroud)
然后我删除id = 2的行
DELETE FROM dogs WHERE id = 2;
Run Code Online (Sandbox Code Playgroud)
然后添加另一行
INSERT INTO …Run Code Online (Sandbox Code Playgroud) nextval ×11
postgresql ×7
sequence ×6
hibernate ×2
sql ×2
.net ×1
codeigniter ×1
database ×1
identity ×1
java ×1
jpa ×1
nhibernate ×1
oracle ×1
oracle11g ×1
plpgsql ×1
select ×1
sql-grant ×1
sql-insert ×1