参数未在本机查询中设置

时间:2018-02-09 11:04:01

标签: java spring-boot spring-data-jpa

我正在使用SpringBoot应用程序,我正在尝试使用以下方法进行简单删除:@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') gbPccStr - 'P0','P1'

我正在实现上述代码,以便根据复合主键删除记录,复合主键是GUELTIG_AB&amp;的组合。 GB_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&amp;在这里吸气

3 个答案:

答案 0 :(得分:1)

这些是绑定参数,它们与SQL语句分开传递给数据库。它们不用于创建带有连接到其中的参数的新SQL语句。

那么具有给定参数的Trunc(typ.GUELTIG_AB) IN (?1)真正归结为:

  

GUELTIG_AB丢弃时间部分,使用系统默认格式将其转换为String,无论发生什么情况,并检查结果字符串是否包含在由单个字符串组成的列表中:&#34; TO_DATE(&#39; 12月12日&#39;,&#39; dd-MM-yy&#39;),TO_DATE(&#39; 2012年9月14日&#39;,& #39; DD-MM-YY&#39;)&#34;

你可能想要的更接近:

  

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_AB&amp;的组合。 GB_PCC。如果可能,建议我如何使用QueryMethod查询来实现这一目的?

这根本不是当前查询正在做的事情。 如果您有包含以下键的行:

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

您无法使用此方法删除例如(d1,p1)(d2,p2),因为它还会删除其他两个元素。

为了解决这个问题,请在您的实体上声明@IdClass。在存储库的类型参数中指定它,并使用常规查询方法。

答案 1 :(得分:0)

首先,在@Param中的datumStr之后有一个空格(&#34; datumStr&#34;)。接下来,将其类型更改为String of List,并以默认DB日期格式传递日期字符串。

(您应该将gbPccStr的类型更改为Sting List)

答案 2 :(得分:0)

你可以这样做。

 @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中的第一个日期给出第二个日期