【问题标题】:Unexpected empty result using spring query method使用spring查询方法的意外空结果
【发布时间】:2016-06-03 12:32:14
【问题描述】:

我正在使用连接到 MySQL 数据库的 Spring Boot 和 JPA 构建一个带有 REST API 的应用程序。为了在 User 类中搜索名称,我实现了一个查询方法:List< User > findByFirstnameLike( String name );

这个方法只返回一个完全匹配的结果,这不是我想要的。我对它的使用有误解吗?

仓库界面:

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) );
}

实体类:

@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”的用户,查询方法会为除“Adam”之外的任何字符串返回一个空列表。

编辑 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 ?

搜索返回一个包含一个对象的数组的精确匹配:

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 ?

【问题讨论】:

  • 是否有拼写错误,firstname vs firstName
  • 你能打开 show sql 并对你的数据库执行它吗?
  • 添加了实体类。不要认为有拼写问题。
  • @blur0224:我添加了 SQL 输出。
  • 如果你想返回 Adam,通常你会使用 like '%dam'。或“Ada%”。文档是否指定在使用 like 时必须放入 %% 通配符?

标签: java spring spring-data-jpa jpql


【解决方案1】:

尝试使用findByFirstnameContaining 而不是findByFirstnameLike

我不确定like 是如何解释的。但是docs 说:

Keyword     | Sample                    | JPQL snippet

Containing  | findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in %)

我猜你想搜索%dam%

如果您想在开头或结尾绑定通配符,也可以:findByFirstnameStartingWithfindByFirstnameEndingWith

【讨论】:

  • 现在我明白了!我是个白痴;)我读了很多遍,但没有注意到!很抱歉浪费您的时间:/
  • @PeterLundgren 没问题。很高兴为您提供帮助:)
【解决方案2】:

来自documentation

关键字 |样品 | JPQL sn-p
喜欢 | findByFirstnameLike... |其中 x.firstname 像 ?1

作为参数传递的值必须包含'%',例如:

List ret = userRepo.findByFirstnameLike(name+"%");

【讨论】:

    【解决方案3】:

    默认情况下,Boot 会自动从带有 @Entity 注释的任何类创建表结构。使用以下属性设置覆盖此行为很简单,此处显示来自应用的 application.properties 文件:

    spring.datasource.initialization-mode=always spring.jpa.hibernate.ddl-auto=none

    【讨论】:

    • 答案不满足实际问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2019-05-04
    • 1970-01-01
    • 2023-03-05
    • 2010-11-25
    • 2014-04-08
    相关资源
    最近更新 更多