2016-06-03 10 views
0

Ich erstelle eine Anwendung mit einer REST-API mithilfe von Spring-Boot und JPA, die mit einer MySQL-Datenbank verbunden sind. Um nach Namen in der Benutzerklasse zu suchen, habe ich eine Abfragemethode implementiert: List<User> findByFirstnameLike(String name);Unerwartetes leeres Ergebnis mithilfe der Spring-Abfrage-Methode

Diese Methode gibt nur ein Ergebnis für eine exakte Übereinstimmung zurück, was ich nicht wollte. Habe ich etwas über seine Verwendung missverstanden?

Das Repository Schnittstelle:

public interface UserRepository extends JpaRepository<User, Long> { 

    public List<User> findByFirstname(String name); 

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

Der Service bean Methode:

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

Die REST-Interface-Methode:

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

Entitätsklasse:

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

Also ... mit einem Benutzer in der Datenbank mit dem Namen "Adam", die Abfrage-Methode gibt eine leere Liste für eine beliebige Zeichenfolge mit Ausnahme von "Adam".

Edit 2: Nach dem Einschalten zeigen SQL drehen und ein Objekt in die Datenbank einfügen, suche ich einen Teil des Vornamens und liefere diese Ausgabe und eine leere Liste:

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 ? 

Das searhing für ein genaue Übereinstimmung, die ein Array mit einem Objekt zurückgibt:

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 ? 
+0

Gibt es einen Schreibfehler, 'Vorname' vs' firstName'? –

+0

Können Sie show sql einschalten und gegen Ihre db ausführen? – blur0224

+0

Die Entitätsklasse wurde hinzugefügt. Denke nicht, dass es ein Rechtschreibproblem gibt. –

Antwort

1

Versuchen zu verwenden findByFirstnameContaining statt findByFirstnameLike.

Ich bin mir nicht sicher, wie like interpretiert wird. Aber die docs sagt:

Keyword  | Sample     | JPQL snippet 

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

Und ich nehme an, Sie für %dam% suchen möchten.

Wenn Sie den Platzhalter am Anfang oder Ende begrenzen möchten, ist dies auch möglich: findByFirstnameStartingWith oder .

+1

Jetzt sehe ich! Ich bin ein Idiot;) Ich habe es oft gelesen, aber nicht bemerkt! Entschuldigung für die Verschwendung Ihrer Zeit:/ –

+0

@PeterLundgren Kein Problem. War mir eine Freude, dir zu helfen :) – Patrick