2016-10-26 2 views
2

Ich habe eine Seite mit einer Liste von Datensätzen. Ich brauche ein Suchfeld in meiner Listenseite wo, wenn der Benutzer ein Schlüsselwort eingibt und auf die Suchschaltfläche klickt, sollte der Inhalt der Tabelle in Abhängigkeit von dem vom Benutzer eingegebenen Schlüssel gefiltert werden.Suche Datensatz mit JSP-Tags

Das habe ich bisher gemacht.

Meiner Ansicht, ich habe dies:

  <form:find finderName="BySearchWord" id="ff_ph_com_domain_Accommodation" path="/accommodations"> 
      <field:input disableFormBinding="true" field="searchKeyword" id="f_ph_com_domain_Accommodation" max="255" required="true"/> 
     </form:find> 

I jsp-Tags für diese Namen finden verwenden.

In meinem Controller habe ich diese Methode. so weit

@RequestMapping(params = "find=BySearchWord", method = RequestMethod.GET) 
public String list(@RequestParam("searchKeyword") String searchKeyword, @RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "size", required = false) Integer size, @RequestParam(value = "sortFieldName", required = false) String sortFieldName, @RequestParam(value = "sortOrder", required = false) String sortOrder, Model uiModel) { 
    if (page != null || size != null) { 
     int sizeNo = size == null ? 10 : size.intValue(); 
     final int firstResult = page == null ? 0 : (page.intValue() - 1) * sizeNo; 
     uiModel.addAttribute("accommodations", Accommodation.findAllAccommodationBySearchBox()); 
    } else { 
     uiModel.addAttribute("accommodations", Accommodation.findAllAccommodationBySearchBox()); 
    } 
    addDateTimeFormatPatterns(uiModel); 
    return "accommodations/list"; 
} 

Ich bin ehrlich gesagt nicht sicher, ob es richtig ist, diese hier zu setzen, aber das ist, was ich auf meiner Domain haben.

public static List<Accommodation> findAllAccommodationBySearchBox() { 
    return entityManager().createQuery("SELECT a FROM Accommodation a WHERE a.person.firstName LIKE :searchKeyword OR a.person.middleName LIKE :searchKeyword OR a.person.lastName LIKE :searchKeyword OR a.room.roomNumber LIKE :searchKeyword OR a.person.pvId LIKE :searchKeyword OR a.startDate LIKE :searchKeyword OR a.endDate LIKE :searchKeyword", Accommodation.class).getResultList(); 
} 


public static List<Accommodation> findAllAccommodationBySearchBox(String searchKeyword) { 
    String jpaQuery = "SELECT a FROM Accommodation a WHERE a.person.firstName LIKE :searchKeyword OR a.person.middleName LIKE :searchKeyword OR a.person.lastName LIKE :searchKeyword OR a.room.roomNumber LIKE :searchKeyword OR a.person.pvId LIKE :searchKeyword OR a.startDate LIKE :searchKeyword OR a.endDate LIKE :searchKeyword"; 
    if (searchKeyword == null || searchKeyword.length() == 0) throw new IllegalArgumentException("The search keyword is required"); 
    searchKeyword = searchKeyword.replace('*', '%'); 
    if (searchKeyword.charAt(0) != '%') { 
    searchKeyword = "%" + searchKeyword; 
    } 
    if (searchKeyword.charAt(searchKeyword.length() - 1) != '%') { 
    searchKeyword = searchKeyword + "%"; 
    } 
    return entityManager().createQuery(jpaQuery, Accommodation.class).getResultList(); 
} 

und diese auf einer anderen Klasse:

public List<Accommodation> findAllAccommodationBySearchBox(String searchKeyword) { 
    if (searchKeyword == null || searchKeyword.length() == 0) throw new IllegalArgumentException("The description argument is required"); 
    searchKeyword = searchKeyword.replace('*', '%'); 
    if (searchKeyword.charAt(0) != '%') { 
     searchKeyword = "%" + searchKeyword; 
    } 
    if (searchKeyword.charAt(searchKeyword.length() - 1) != '%') { 
     searchKeyword = searchKeyword + "%"; 
    } 
    EntityManager em = Accommodation.entityManager(); 
    TypedQuery<Accommodation> q = em.createQuery("SELECT a FROM Accommodation a WHERE a.person.firstName LIKE :searchKeyword OR a.person.middleName LIKE :searchKeyword OR a.person.lastName LIKE :searchKeyword OR a.room.roomNumber LIKE :searchKeyword OR a.person.pvId LIKE :searchKeyword OR a.startDate LIKE :searchKeyword OR a.endDate LIKE :searchKeyword", Accommodation.class); 
    q.setParameter("searchKeyword", searchKeyword); 
    return q.getResultList(); 
} 

verfolge ich ein Tutorial ich online gefunden habe, aber die Struktur, dass ist ein bisschen anders mit dem, was ich habe, so konnte ich nicht ganz Punkt aus was ich nicht gemacht habe. Ich bin jetzt wirklich verloren. Ich habe das schon seit fast einem Tag versucht herauszufinden.

P.S. Ich bin nur so weit gekommen, etwas in das Suchfeld eingeben zu können und die Seite umleiten zu lassen, nachdem ich auf die Suchschaltfläche geklickt habe, aber ich bekam nur eine Ausnahmebedingung mit dem Betreff "Suchargument searchKeyword nicht gefunden in der Liste der Parameter während der Ausführung der Abfrage. "

Hoffe jemand kann mir helfen.

Antwort

1

Dieser ganze Code sieht ein wenig chaotisch aus, aber Ihr erstes Problem wäre die list(...) Methode in Ihrem Controller. Es braucht eine Menge Argumente, aber was es im Grunde genommen ist:

weil Ihre if-Aussage überhaupt keine Rolle spielt. Also fixiere deine if-Anweisung, wenn du etwas machen willst. Wahrscheinlich möchten Sie das Suchergebnis einschränken, also übergeben Sie die Werte an findAllAccommodationBySearchBox() und verwenden Sie sie mit setMaxResults() und setFirstResult() Methoden.

Jetzt rufen Sie findAllAccommodationBySearchBox() Methode ohne Argumente (dies sollte überhaupt nicht mit Ihrer Abfrage möglich sein), die immer die Ausnahme auslösen wird, da Sie die Abfrage nicht mit erforderlichen Parametern bereitstellen.

Ihre 'erste' (Sie wollen nicht zwei Methoden mit gleicher Verwendung, gleichen Namen, gleichen Argumenten und sogar unterschiedlichen Code innerhalb btw) findAllAccommodationBySearchBox(String searchKeyword) auch nicht erforderlichen Parameter hinzufügen.

+0

Es ist eine Menge chaotisch, ich gebe zu. Ich habe meine Methode geändert und dann einen Parameter zu findAllAcommodationBySearchBox() hinzugefügt, aber es gibt immer noch dieselbe Ausnahme zurück. Was scheint das Problem zu sein? –

+0

Sie fügen Parameter der Abfrage in Ihrer 'ersten' Methode nicht hinzu. Auch, aktualisierte Antwort. – qwerty1423

+0

Ich entfernte meine erste Methode und die Ausnahme war weg. Stattdessen wurde es nur auf die Listenseite umgeleitet, aber ich glaube nicht, dass es die Abfrage ausführt, da der Inhalt der Liste immer noch derselbe ist. –

Verwandte Themen