2

私のアプリケーションでは、UIにStruts2を使用し、DAOレイヤーにJPAを使用しています。そして、Oracle11Gデータベース。

私のデータベースでは、シーケンスを作成しました。

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 に何らかの方法があるので、出力シーケンスを変更できますか?

No. Sequence は、数列の生成にのみ使用されます。したがって、数値以外のものを生成するように強制することはできません。そのためには、暗黙的または明示的なデータ型の変換と連結を使用して、目的の形式の文字列を生成する必要があります。別の方法として、to_char関数を使用して、シーケンスによって生成された数値を左ゼロが埋め込まれた文字列に変換できます。

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

  RES
-------
 000004 

連結 (バーまたは「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セッターメソッド自体にロジックを書くことで、この問題を解決しました。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 に答える