2014-10-03 47 views
0

我需要一個簡單的序列,它會給我遞增的整數,我稍後將其用作字符串的一部分。休眠不能找到序列

我做了使用postgresql命令行順序:

CREATE SEQUENCE my_seq 
INCREMENT BY 1 

序列存在,我可以從PostgreSQL的命令行查詢,但我想用hibernate得到的值:

Query query = session.createSQLQuery("select nextval(:sequence);"); 
query.setParameter("sequence", "my_seq"); 
Long nextVal=((BigInteger)query.uniqueResult()).longValue(); 

而且我得到這個異常:

ERROR: relation "my_seq" does not exist 

序列值不代表任何實體的屬性。我只需要它們來存儲登錄次數,但我不會將登錄名存儲爲實體。

編輯:我把它加入該計劃名稱查詢工作:

String query1 = "select nextval(myscheme.my_seq)"; 
Query query = session.createSQLQuery(query1); 

我想不通爲什麼它需要的方案雖然,因爲myscheme已經默認設置,所有其他查詢沒有指定方案工作良好。如果任何人都可以說出一些亮點,我會接受它的答案。

+0

如果你在數據庫客戶端本身運行它,那麼'select nextval(my_seq)'工作嗎? – Elbek 2014-10-03 13:43:17

+0

是的,它返回遞增的值。 – 2014-10-03 13:44:09

+0

這個鏈接可能會幫助你看看http://stackoverflow.com/questions/6386888/get-next-sequence-value-from-database-using-hibernate – 2014-10-03 14:42:26

回答

1

您不需要將序列映射到實體。 只需爲實體的ID列留下映射,並且將從序列my_seq生成tntity的id。你不需要調用nextval(my_seq)或其他任何東西。

@Entity("myEntity") 
public class MyEntity { 

    @Id 
    @Column(name = "id", unique = true, nullable = false, insertable=false) 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "my_seq") 
    @SequenceGenerator(name = "my_seq", sequenceName = "my_seq", allocationSize = 1) 
    private long id; 
} 
+0

正如我所說,序列不是一個實體的屬性,我沒有任何'myEntity',也不需要它。我只需要來自nextVal的整數,因此我可以將它用作代碼的一部分。更具體地說,我將形成一個字符串:'「你是」+ nextValOfSequence +「第n個用戶」,我將發送給用戶,但是我不會將用戶存儲在數據庫中。 – 2014-10-03 14:28:48

+0

在這種情況下,你應該只需要調用session.createSQLQuery(「select nextval(my_seq)」),而不需要任何映射。 – Giovanni 2014-10-03 14:35:13

+0

我做到了,但是hibernate找不到它。 – 2014-10-03 14:36:57

0

下面將使用一個名爲「my_seq」序列從數據庫中,並將其映射到列「欄」表「表格名」

不久的邏輯導入類序列發生器應後在開始類

@Entity 
@org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true) 
@Table(name = "table_name") 
@SequenceGenerator(name = "my_seq", sequenceName = "my_seq") 

public class ClassName implements Serializable { 

private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO, generator = "my_seq") 
@Column(name = "column_name") 
private Long columnName; 

}

讓我知道這是有用的之前。

+0

謝謝,但我不想將它映射到任何表格。我知道它的工作。 – 2014-10-03 20:27:19

0

爲了避免硬編碼模式到您的查詢,您可以在persistence.xml中設置hibernate.default_schema屬性,如下所示。

<property name="hibernate.default_schema" value="myscheme"/> 

這也可以在彈簧配置文件中使用,如here所述。