使用 spring 查询方法的意外空结果
Unexpected empty result using spring query method
我正在构建一个带有 REST API 的应用程序,使用 spring 引导和连接到 MySQL 数据库的 JPA。要在用户 class 中搜索名称,我已经实现了一个查询方法:List< User > findByFirstnameLike( String name );
这个方法只returns一个完全匹配的结果,这不是我想要的。我对它的使用有什么误解吗?
存储库界面:
public interface UserRepository extends JpaRepository<User, Long> {
public List< User > findByFirstname( String name );
public List< User > findByFirstnameLike( String name );
}
服务bean方法:
@Override
public List<User> findByFirstNameLike(String name) {
logger.info( "searching for first name: {}", name);
List< User > ret = userRepo.findByFirstnameLike(name);
if( null == ret ){
logger.info("No list returned from search");
}
else{
logger.info( "List size = {}", ret.size() );
}
return( ret );
}
REST接口方法:
@RequestMapping(
value="/{firstName}",
method=RequestMethod.GET,
produces=MediaType.APPLICATION_JSON_VALUE )
public ResponseEntity< List< User > > SearchForUserByFirstName( @PathVariable( "firstName" ) String firstName ){
return( new ResponseEntity< List< User > >( userService.findByFirstNameLike( firstName ), HttpStatus.OK) );
}
实体class:
@Entity
public class User {
public enum Department {
BS, BA, BT, BD, UX, SALES
}
@Id
@GeneratedValue
private Long id;
private String firstname;
private String lastname;
private String email;
private String phone;
private Department department;
所以...在数据库中有一个名为 "Adam" 的用户,查询方法 returns 为除 "Adam".[=18= 之外的任何字符串的空列表]
编辑 2:
打开 show SQL 并将一个对象插入数据库后,我搜索了名字的一部分并产生了这个输出和一个空列表:
searching for first name: dam <-- This is the log print
Hibernate: select user0_.id as id1_6_, user0_.department as
departme2_6_, user0_.email as email3_6_, user0_.firstname as
firstnam4_6_, user0_.lastname as lastname5_6_, user0_.phone as
phone6_6_ from user user0_ where user0_.firstname like ?
搜索 returns 一个包含一个对象的数组:
searching for first name: Adam
Hibernate: select user0_.id as id1_6_, user0_.department as
departme2_6_, user0_.email as email3_6_, user0_.firstname as
firstnam4_6_, user0_.lastname as lastname5_6_, user0_.phone as
phone6_6_ from user user0_ where user0_.firstname like ?
尝试使用 findByFirstnameContaining
而不是 findByFirstnameLike
。
我不确定 like
是如何解释的。但是 docs 说:
Keyword | Sample | JPQL snippet
Containing | findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in %)
我想你想搜索 %dam%
。
如果你想在开头或结尾绑定通配符,这也是可能的:findByFirstnameStartingWith
或findByFirstnameEndingWith
。
来自 documentation:
Keyword | Sample | JPQL snippet
Like | findByFirstnameLike… | where x.firstname like ?1
作为参数传递的值必须包含“%”,例如:
列表 ret = userRepo.findByFirstnameLike(name+"%");
默认情况下,Boot 会自动从任何使用 @Entity 注释的 类 创建 table 结构。使用以下 属性 设置可以很简单地覆盖此行为,如应用的 application.properties 文件所示:
spring.datasource.initialization-mode=总是
spring.jpa.hibernate.ddl-auto=none
我正在构建一个带有 REST API 的应用程序,使用 spring 引导和连接到 MySQL 数据库的 JPA。要在用户 class 中搜索名称,我已经实现了一个查询方法:List< User > findByFirstnameLike( String name );
这个方法只returns一个完全匹配的结果,这不是我想要的。我对它的使用有什么误解吗?
存储库界面:
public interface UserRepository extends JpaRepository<User, Long> {
public List< User > findByFirstname( String name );
public List< User > findByFirstnameLike( String name );
}
服务bean方法:
@Override
public List<User> findByFirstNameLike(String name) {
logger.info( "searching for first name: {}", name);
List< User > ret = userRepo.findByFirstnameLike(name);
if( null == ret ){
logger.info("No list returned from search");
}
else{
logger.info( "List size = {}", ret.size() );
}
return( ret );
}
REST接口方法:
@RequestMapping(
value="/{firstName}",
method=RequestMethod.GET,
produces=MediaType.APPLICATION_JSON_VALUE )
public ResponseEntity< List< User > > SearchForUserByFirstName( @PathVariable( "firstName" ) String firstName ){
return( new ResponseEntity< List< User > >( userService.findByFirstNameLike( firstName ), HttpStatus.OK) );
}
实体class:
@Entity
public class User {
public enum Department {
BS, BA, BT, BD, UX, SALES
}
@Id
@GeneratedValue
private Long id;
private String firstname;
private String lastname;
private String email;
private String phone;
private Department department;
所以...在数据库中有一个名为 "Adam" 的用户,查询方法 returns 为除 "Adam".[=18= 之外的任何字符串的空列表]
编辑 2: 打开 show SQL 并将一个对象插入数据库后,我搜索了名字的一部分并产生了这个输出和一个空列表:
searching for first name: dam <-- This is the log print
Hibernate: select user0_.id as id1_6_, user0_.department as
departme2_6_, user0_.email as email3_6_, user0_.firstname as
firstnam4_6_, user0_.lastname as lastname5_6_, user0_.phone as
phone6_6_ from user user0_ where user0_.firstname like ?
搜索 returns 一个包含一个对象的数组:
searching for first name: Adam
Hibernate: select user0_.id as id1_6_, user0_.department as
departme2_6_, user0_.email as email3_6_, user0_.firstname as
firstnam4_6_, user0_.lastname as lastname5_6_, user0_.phone as
phone6_6_ from user user0_ where user0_.firstname like ?
尝试使用 findByFirstnameContaining
而不是 findByFirstnameLike
。
我不确定 like
是如何解释的。但是 docs 说:
Keyword | Sample | JPQL snippet
Containing | findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in %)
我想你想搜索 %dam%
。
如果你想在开头或结尾绑定通配符,这也是可能的:findByFirstnameStartingWith
或findByFirstnameEndingWith
。
来自 documentation:
Keyword | Sample | JPQL snippet
Like | findByFirstnameLike… | where x.firstname like ?1
作为参数传递的值必须包含“%”,例如:
列表 ret = userRepo.findByFirstnameLike(name+"%");
默认情况下,Boot 会自动从任何使用 @Entity 注释的 类 创建 table 结构。使用以下 属性 设置可以很简单地覆盖此行为,如应用的 application.properties 文件所示:
spring.datasource.initialization-mode=总是 spring.jpa.hibernate.ddl-auto=none