我困在更新來自時間戳數據的記錄的棘手難題上。基於具有時間戳類型的主鍵複合的更新記錄
技術:
- 春季和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子句中使用時間戳不是一個好主意,但工作流程以這種方式工作,並且我無法更改時間戳是唯一的,並且是包含文件夾的複合主鍵的一部分數量和類型。
你有關於如何解決它的想法嗎?
不知道爲什麼你說的是壞主意使用時間戳'WHERE'?正如你所說的那樣,查詢直接在數據庫上工作確定。你有沒有嘗試刪除'WHERE'的時間戳條件,看看你能否得到任何結果(當然,測試是否是開發人員數據庫)。 –
這是一個壞主意,因爲要執行更新查詢或刪除查詢,它應該只基於身份號碼,但在我的情況下,我不能只使用文件夾的身份。是的,我沒有任何結果只使用文件夾號碼和類型的WHERE條件 – PauloDev
您可以更改'TYPE_DOSS CHAR(4)'到'TYPE_DOSS VARCHAR(4)'?如果不是,則需要填充傳入的三字符輸入。 –