簡體   English   中英

未在本機查詢中設置參數

[英]Parameters not being set in native query

我正在開發一個 SpringBoot 應用程序,我正在嘗試使用以下@Query(value="", nativeQuery = true)進行簡單的刪除: @Query(value="", nativeQuery = true)

我的查詢有動態參數,但參數沒有被替換,我也沒有在控制台上收到任何錯誤。

我嘗試了帶有硬編碼參數的 NativeQuery,它工作得非常好。

下面是代碼:

@Repository
public interface TypGbPccRepo extends JpaRepository<TypGbPcc, String>{    

@Transactional
@Modifying(ClearAutomatically = true)
@Query(value = "delete from T_ST_KFR__TYP_GB_PCC typ where  Trunc(typ.GUELTIG_AB) IN (?1) and typ.GB_PCC IN (?2)" , nativeQuery=true)
void deleteRecords(String datumStr , String gbPccStr);

}

我什至嘗試了以下查詢:

@Query(value = "delete from T_ST_KFR__TYP_GB_PCC typ where  Trunc(typ.GUELTIG_AB) IN (:datumStr ) and typ.GB_PCC IN (:gbPccStr)" , nativeQuery=true)
void deleteRecords(@Param("datumStr ") String datumStr , @Param("gbPccStr") String gbPccStr);

我試圖替換的參數:

datumStr - TO_DATE('12-Sep-2012', 'dd-MM-yy'), TO_DATE('14-Sep-2012', 'dd-MM-yy') -Sep TO_DATE('12-Sep-2012', 'dd-MM-yy'), TO_DATE('14-Sep-2012', 'dd-MM-yy') gbPccStr - 'P0','P1'

我正在實施上面的代碼來刪除基於復合主鍵的記錄,復合主鍵是GUELTIG_ABGB_PCC的組合。 如果可能,建議我如何使用查詢 QueryMethod 來實現這一點?

我已經能夠使用 QueryMethod 刪除基於未復合的 Primary 的記錄,但我無法對復合主鍵執行此操作。 我必須一次性刪除多條記錄。

下面是我的 POJO

@Entity
@IdClass(TypGbPccId.class)
@Table(name="T_ST_KFR_TYP_GB_PCC")

public class  TypGbPcc implements Serializable{


private static  final long serialVersionUID = .....

@Id
@Column(name="GB_PCC")
private String gbPcc = null ;

@Column(name="GB_PCC_desc")
priavte String gbPccDesc = null ;

@Column(name="GB_PCC_SQL")
priavte String gbPccSql = null ;

@Id
@Column(name="GUELTIG_AB")
@JsonFormat(pattern = "dd-MM-yyyy")
private String gueltigAb = null ;

}

setter 和 getter 在這里

這些是綁定參數,它們與 SQL 語句分開傳遞到數據庫。 它們不用於創建帶有連接到其中的參數的新 SQL 語句。

那么帶有給定參數的Trunc(typ.GUELTIG_AB) IN (?1)真正歸結為:

丟棄GUELTIG_AB的時間部分,使用系統默認格式將其轉換為字符串,無論發生什么情況,並檢查結果字符串是否包含在由單個字符串組成的列表中: “TO_DATE('12-Sep-2012 ', 'dd-MM-yy'),TO_DATE('14-Sep-2012', 'dd-MM-yy')"

你可能想要的是更接近:

日期列表中的GUELTIG_AB元素有兩個元素2014 年 9 月 12 日2014 年9 月14 日

因此,您的方法應如下所示:

@Modifying(ClearAutomatically = true)
@Query(value = "delete from T_ST_KFR__TYP_GB_PCC typ " + 
     "where  Trunc(typ.GUELTIG_AB) IN (?1) " + 
     "and typ.GB_PCC IN (?2)"
     , nativeQuery=true)
void deleteRecords(List<java.sql.Date> dates , List<String> gbPccStr);

注意:方法上不需要@Transactional注解,接口上也不需要@Repository注解。

我正在實施上面的代碼來刪除基於復合主鍵的記錄,復合主鍵是GUELTIG_ABGB_PCC的組合。 如果可能,建議我如何使用查詢 QueryMethod 來實現這一點?

這根本不是當前查詢在做什么。 如果您有具有以下鍵的行:

(d1,p1)
(d1,p2)
(d2,p1)
(d2,p2)

例如(d1,p1)您不能使用這種方法刪除(d1,p1)(d2,p2) ,因為它還會刪除其他兩個元素。

為了解決這個問題, @IdClass在您的實體上聲明一個@IdClass 在存儲庫的類型參數中指定它並使用普通查詢方法。

首先,@Param("datumStr ") 中的 datumStr 后面有一個空格。 接下來,將其類型更改為 List of String 並以默認數據庫日期格式傳遞日期字符串。

(您也應該將 gbPccStr 的類型更改為 Sting 列表)

你可以做這樣的事情。

 @Query(value = "delete from TypGbPcc where  func('TRUNC',gueltigAb) IN func('TO_DATE',:dateOne,'dd/mm/yyyy') and
func('TRUNC',gueltigAb) IN func('TO_DATE',:dateTwo,'dd/mm/yyyy') and gbPcc IN (:gbPccStr)" , nativeQuery=true)
void deleteRecords(@Param("dateOne") String dateOne ,@Param("dateTwo") String dateTwo, @Param("gbPccStr") String gbPccStr);

在 dateOne 中給出第一個日期 在 dateTwo 中給出第二個日期

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM