2017-08-11 44 views
0

我困在更新來自時間戳數據的記錄的棘手難題上。基於具有時間戳類型的主鍵複合的更新記錄

技術:

  • 春季和Java
  • Hibernate和JPA
  • 甲骨文DATABSE的版本11g的

爲表創建SQL腳本:

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請求:

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') 

你應該知道,記錄可以具有相同的文件夾數量和類型,但從來沒有相同的日期,因爲它是用毫秒的時間戳。

例如:

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子句中使用時間戳不是一個好主意,但工作流程以這種方式工作,並且我無法更改時間戳是唯一的,並且是包含文件夾的複合主鍵的一部分數量和類型。

你有關於如何解決它的想法嗎?

+0

不知道爲什麼你說的是壞主意使用時間戳'WHERE'?正如你所說的那樣,查詢直接在數據庫上工作確定。你有沒有嘗試刪除'WHERE'的時間戳條件,看看你能否得到任何結果(當然,測試是否是開發人員數據庫)。 –

+0

這是一個壞主意,因爲要執行更新查詢或刪除查詢,它應該只基於身份號碼,但在我的情況下,我不能只使用文件夾的身份。是的,我沒有任何結果只使用文件夾號碼和類型的WHERE條件 – PauloDev

+2

您可以更改'TYPE_DOSS CHAR(4)'到'TYPE_DOSS VARCHAR(4)'?如果不是,則需要填充傳入的三字符輸入。 –

回答

0

執行與JDBC或PreparedStatement的這個SQL請求,記錄更新和正常工作

+0

是的我已經使用JDBC或PreparedStatement執行了我的SQL請求,但結果相同。無論如何,我發現解決方案感謝@MickMnemonic :) – PauloDev

相關問題