如何在生成的序列号中附加String

时间:2012-10-30 13:46:20

标签: oracle jpa

在我的应用程序中,我使用Struts2 for UI和JPA for DAO layer。和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中实现上述查询? OR在ORACLE中有什么办法,所以我们可以改变输出序列吗?

2 个答案:

答案 0 :(得分:4)

  

OR在ORACLE中有什么办法,所以我们可以改变输出序列吗?

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

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

  RES
-------
 000004 

连接(bar或`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

答案 1 :(得分:2)

我通过在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;
    }
}

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