我真的很感激帮助我的问题,因为我花了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
表中添加了一行,值为b
的1
。我调用了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会隐式地将字符串转换为整数?
1条答案
按热度按时间zyfwsgd61#
Spring Data JPA不做查询参数的转换。如果你的JPA实现会做的话,但我怀疑这是怎么回事。
你说SQL会做这样的转换是完全错误的。有些数据库可能会做这样的转换,而它们到底做什么当然取决于数据库。因此,依赖它是一个坏主意。