需要通过hibernate只使用Oracle Sequence,来生成唯一的顺序文件名

时间:2014-07-31 06:58:40

标签: java sql oracle hibernate

我正在创建一个程序来创建一个文件并给它一个唯一的名称。 根据提出的技术,我们需要有顺序文件名。 恩。 Myfile-00001(格式:MyFile-Sequence)。 我正在使用oracle序列来维护文件名的序列号。

下面是我试图编写的示例代码,以获取oracle序列中的序列。 如果我只能从Oracle序列中获取序列字符串,我可以使用它来命名我正在创建的文件。

以下是我的代码:

public class TestSequence {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Configuration cfg = new Configuration();
        cfg.configure();
        SessionFactory sf = cfg.buildSessionFactory();
        Session ses = sf.openSession();
        System.out.println("Next Val: "+getNextKey(ses));
    ses.close();
    sf.close();
    }

    public static String getNextKey(Session ses)
    {
        Query query = ses.createSQLQuery( "select atl_seq.nextval from dual" );
        String key = (String) query.uniqueResult();
        return key;
    }
    }

但它给了我错误:

    Next Val: 
Hibernate: select atl_seq.nextval from dual
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.lang.String
    at test.TestSequence.getNextKey(TestSequence.java:31)
    at test.TestSequence.main(TestSequence.java:23)

请帮助我如何将唯一结果转换为字符串。 没有使用映射文件,因为我直接运行查询。

我已经google了很多并找到了类似的例子,他们将独特的结果转换为Long,但即使该代码没有运行,它也给我同样的错误:无法将[Ljava.lang.Object强制转换为Long。

我的序列是:

 CREATE SEQUENCE   "ATL_SEQ"  MINVALUE 1 MAXVALUE 100 INCREMENT BY 1 START WITH 1 CACHE 48 

2 个答案:

答案 0 :(得分:0)

序列可能返回long或整数。所以你需要转换为而不是字符串!

Long key = (Long) query.uniqueResult();

Integer key = (Integer) query.uniqueResult();

不知道它是哪一个,但很容易为自己尝试。

答案 1 :(得分:0)

尝试使用addScalar()并将类型指定为Long(对于 Hibernate4

public static Long getNextKey(Session ses) {
     Query query = ses.createSQLQuery("select atl_seq.nextval as num from dual") 
                        .addScalar("num", LongType.INSTANCE);
     return (Long)query.uniqueResult();
 }

如果您使用的是 Hibernate3 ,请输入

addScalar("num", Hibernate.LONG);

您可以稍后将值Long转换为String