Skip to content
Advertisement

Unexpected empty result using spring query method

I am building an application with a REST API using spring boot and JPA connected to a MySQL database. To search for names in the User class I have implemented a query method: List< User > findByFirstnameLike( String name );

This method only returns a result on an exact match, which is not what I wanted. Have I misunderstood something about its use?

The repository interface:

public interface UserRepository extends JpaRepository<User, Long> {

    public List< User > findByFirstname( String name );

    public List< User > findByFirstnameLike( String name );
}

The service bean method:

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

The REST interface method:

@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 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;

So… having a user in the database with the name “Adam”, the query method returns an empty list for any string except for “Adam”.

Edit 2: After turning on show SQL and inserting an object to the database, I search for a part of the first name and yield this output and an empty List:

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 ?

The searhing for an exact match which returns an array with one object:

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 ?

Answer

Try to use findByFirstnameContaining instead of findByFirstnameLike.

I am not sure how like is interpreted. But the docs says:

Keyword     | Sample                    | JPQL snippet

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

And I suppose you want to search for %dam%.

If you want to bound the wildcard at the beginning or ending this is also possible: findByFirstnameStartingWith or findByFirstnameEndingWith.

Advertisement