2017-08-11 11 views
0

タイムスタンプデータからレコードを更新するのは難しくて面倒な問題があります。タイムスタンプタイプのプライマリキーコンポジットに基づいたレコードの更新

CREATE TABLE DOSSIER(
    NUM_DOSS NUMBER NOT NULL, 
    TYPE_DOSS CHAR(4) NOT NULL, 
    DATE_DOSS TIMESTAMP(6) NOT NULL, 
    DSC_DOSS VARCHAR(25), 
    NUM_CNFR VARCHAR(25), 
    TMS_CREA TIMESTAMP(6) NOT NULL, 
    TMS_MAJ TIMESTAMP(6) NOT NULL, 
    CONSTRAINT PK_TDECL_RMGV PRIMARY KEY(NUM_DOSS, TYPE_DOSS, DATE_DOSS) 
); 

技術:

テーブルに対してSQLスクリプトを作成して11gのバージョンのための

  • 春とJavaは
  • HibernateとJPA
  • のOracle Databseあなたはそれをミリ秒単位でのタイムスタンプがありますので、レコードが同じフォルダの数とタイプが、決して同じ日付を持つことができることを知っている必要があり

    UPDATE DOSSIER 
        SET 
         NUM_CNFR='999' 
        WHERE 
         NUM_DOSS_='2006103009564900' 
         and TYP_DOSS='011' 
         and DATE_DOSS= TO_TIMESTAMP('2017-08-09 16:57:03.786586', 'YYYY-MM-DD HH24:MI:SS.FF6') 
    

    はここに更新のための私のSQL要求です。例えば

    NUM_DOSS   TYP_DOSS DATE_DOSS     NUM_CNFR 
    2006103009564900 | 011  | 2017-08-09 16:57:03.786586 | null 
    2006103009564900 | 011  | 2017-08-09 16:57:03.786589 | 0125 
    

    マイDossierEntityPKクラス:

    @Embeddable 
    public class DossierEntityPK implements Serializable { 
    
        private static final long serialVersionUID = -4418929855229352729L; 
    
        @Column(name = "NUM_DOSS", nullable = false) 
        private String numDossier; 
    
        @Column(name = "TYPE_DOSS", nullable = false) 
        private String typeDossier; 
    
        @Temporal(TemporalType.TIMESTAMP) 
        @Column(name = "DATE_DOSS", updatable = false, nullable = false, columnDefinition="TIMESTAMP DEFAULT") 
        private Date dateDossier; 
    } 
    

    マイDossierEntityクラス:

    @Entity 
    @Table(name = "TDECL_RMGV") 
    public class OERemiseGouvModele { 
    
        @EmbeddedId 
        private DossierEntityPK dossierEntityPK; 
    
        @Column(name = "DSC_DOSS", nullable = true) 
        private String descriptionDossier; 
    
        @Column(name = "NUM_CNFR", nullable = true) 
        private String numConfirmation; 
    
        @Temporal(TemporalType.TIMESTAMP) 
        @Column(name = "TMS_CREA", nullable = false) 
        private Date tmsCreation; 
    
        @Temporal(TemporalType.TIMESTAMP) 
        @Column(name = "TMS_MAJ", nullable = false) 
        private Date tmsMaj; 
    } 
    

    私は今、JPQLの私のクエリをあなたが表示されます:

    @Modifying 
    @Query("UPDATE DossierEntity d SET d.numConfirmation=:numConfirmation WHERE d.dossierEntityPK.numDossier=:numDossierAND d.dossierEntityPK.typeDossier=:typeDossier AND d.dossierEntityPK.dateDossier= TO_TIMESTAMP(:dateDossier, 'YYYY-MM-DD HH24:MI:SS.FF6')") 
    int updateFolder(@Param("numConfirmation") String numConfirmation, @Param("numDossier") String numDossier, @Param("typeDossier") String typeDossier, @Param("dateDossier") Date dateDossier); 
    

    その後、私のWebアプリケーションからこのメソッドを実行すると、Hibernateから空の結果が出ます。しかし、私のデータベース上でこのSQLリクエストの更新を直接実行すると、うまくいきます!

    私はJDBCまたはPreparedStatementでこのSQLリクエストを実行しますが、私は同じ空の結果を得て、レコードは更新されません。

    これは、WHERE句でタイムスタンプを使用するのは良い考えではありませんが、ワークフローはこのように動作し、タイムスタンプは一意であり、フォルダのある複合主キーの一部に変更できません番号とタイプ。

    あなたはそれを修正する方法について考えていますか?あなたはWHERE` `で悪いアイデアの使用のタイムスタンプであることを特徴とする理由JDBCとかのPreparedStatementでこのSQL要求を実行

+0

正常に動作しているか分からないのですか?あなたはすでにDB上で直接クエリがOKを働いていると言っています。 'WHERE'のタイムスタンプ条件を削除しようとしましたが、何か結果が得られるかどうかを確認しました(もちろん、開発者データベースがあればテストできます)。 –

+0

更新クエリまたは削除クエリを実行するにはID番号のみに基づいている必要があるため、私の場合はフォルダのIDのみを使用することはできません。はい、私はしたし、WHERE条件のフォルダ番号と型だけを使用して結果がありません – PauloDev

+2

'TYPE_DOSS CHAR(4)'を 'TYPE_DOSS VARCHAR(4)'に変更できますか? –

答えて

0

、レコードが更新され、

+0

はい私はすでにJDBCまたはPreparedStatementでSQLリクエストを実行しましたが、同じ結果が出ました。とにかく私は@MickMnemonicへのソリューション感謝を見つけた:) – PauloDev

関連する問題