为什么Spring Data JPA不像SQL那样进行隐式类型转换?

mqkwyuun  于 2023-11-19  发布在  Spring
关注(0)|答案(1)|浏览(153)

我真的很感激帮助我的问题,因为我花了5个小时研究Spring Data JPA和SQL。我仍然对我的问题感到困惑,如果你能用简单的术语解释,我会非常感激。谢谢!
我使用Sping Boot 和SQLite作为我的数据库。我有一个名为A.java的类:

@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
public class A {
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id; 

    private int b;
}

字符串
我的JPA存储库文件ARepo.java看起来像这样:

public interface ARepo extends JpaRepository<A, Long> {

    List<A> findByBContaining(String b);

}


我在a表中添加了一行,值为b1。我调用了findByBContaining("1");,出现了以下错误消息:

2023-08-12 16:07:51.597 ERROR 17460 --- [nio-8085-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    :
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request
processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException:
Parameter value [%1%] did not match expected type [java.lang.Integer (n/a)]; nested exception is
java.lang.IllegalArgumentException: Parameter value [%1%] did not match expected type
[java.lang.Integer (n/a)]] with root cause


我知道这个问题可以通过在A.java中将private int b改为private String b来解决。但是我想知道为什么我上面的代码不能工作。findByBContaining("1")翻译成SQL将是SELECT * FROM a WHERE b LIKE '%1%';。由于SQL具有隐式转换,字符串%1%不会转换为整数,并且能够与表a中的b的值进行比较?
Spring Data JPA是否进行隐式转换,或者我是否错误地认为如果列的值是整数,SQL会隐式地将字符串转换为整数?

zyfwsgd6

zyfwsgd61#

Spring Data JPA不做查询参数的转换。如果你的JPA实现会做的话,但我怀疑这是怎么回事。
你说SQL会做这样的转换是完全错误的。有些数据库可能会做这样的转换,而它们到底做什么当然取决于数据库。因此,依赖它是一个坏主意。

相关问题