タイムスタンプデータからレコードを更新するのは難しくて面倒な問題があります。タイムスタンプタイプのプライマリキーコンポジットに基づいたレコードの更新
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要求を実行
正常に動作しているか分からないのですか?あなたはすでにDB上で直接クエリがOKを働いていると言っています。 'WHERE'のタイムスタンプ条件を削除しようとしましたが、何か結果が得られるかどうかを確認しました(もちろん、開発者データベースがあればテストできます)。 –
更新クエリまたは削除クエリを実行するにはID番号のみに基づいている必要があるため、私の場合はフォルダのIDのみを使用することはできません。はい、私はしたし、WHERE条件のフォルダ番号と型だけを使用して結果がありません – PauloDev
'TYPE_DOSS CHAR(4)'を 'TYPE_DOSS VARCHAR(4)'に変更できますか? –