2

在我的应用程序中,我将 Struts2 用于 UI,将 JPA 用于 DAO 层。和Oracle 11G 数据库。

在我的数据库中,我创建了一个序列..

CREATE SEQUENCE  "PERK"."EMP_CODE_SEQ"  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 501 CACHE 500 NOORDER  NOCYCLE ;

现在我的要求改变了。根据要求,我想将“TMP”附加到我生成的序列号。

例如:如果我的序列号是:1 那么它会给我 TMP000001。

为此,SQL 查询将是这样的..

select 'TMP'||lpad(EMP_CODE_SEQ.nextval,6, '0') test from dual;

但是有什么方法可以在 JPA 中实现上述查询吗?ORACLE有什么办法可以改变输出顺序吗?

4

2 回答 2

4

ORACLE有什么办法可以改变输出顺序吗?

没有。Sequence 仅用于生成编号规则。所以你不能强迫它生成除数字之外的任何东西。为此,您将需要使用隐式或显式数据类型转换和连接来生成所需格式的字符串。作为替代方案,您可以使用to_char函数将序列生成的数字转换为左零填充字符串。

SQL> select to_char(sq_id.nextval, '000000') res
  2    from dual
  3  /

  RES
-------
 000004 

连接(bars 或 `concat' 函数):

SQL> select 'TMP' || to_char(sq_id.nextval, '000000') res
  2    from dual
  3  /

RES
----------
TMP 000006

SQL> select concat('TMP',to_char(sq_id.nextval, '000000')) res
  2    from dual
  3  /

RES
----------
TMP 000007
于 2012-10-30T14:36:15.480 回答
3

我通过在 JPA setter 方法本身中编写逻辑解决了这个问题。这是 JPA 实体的示例。

@Entity
@Table(name = "MST_EMP")
public class MstEmp implements Serializable, IsEntity {
    private static final long serialVersionUID = 1L;

    @Id 
    @Column(name = "EMP_CODE")
    @SequenceGenerator( name = "appEmpSeq", sequenceName = "EMP_CODE_SEQ")  
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "appEmpSeq" )
    private String empCode;


    public MstEmp() {
    }

    public String getEmpCode() {
        return this.empCode;
    }

    public void setEmpCode(String empCode) {        
        this.empCode =  getSequencePrefix(empCode)+empCode;
    }



    /**
     * FUNCTION USED TO GENERATE SEQUENCE PREFIX: TEMP+"REQUIRED ZEROs"+EMP CODE
     * @param empCode
     * @return
     */
    public String getSequencePrefix(String empCode){
        String temp = "TEMP";
        if(empCode.length()<6){
            int zeroCount = 6 - empCode.length();

            for(int index=0;index<zeroCount;index++){
                temp = temp + "0";
            }
        }
        return temp;
    }
}

这里..在设置员工代码时,它会调用一个函数来将所需的前缀连接到序列号。

于 2012-10-31T05:12:04.460 回答