[JAVA] Machen Sie die where-Klauselvariable in Spring Data JPA
Zweck
- Zeigen Sie die Suchergebnisse auf dem Listensuchbildschirm an
- Verwenden Sie für die Suchbedingung das eingegebene Element, ignorieren Sie es bei durchsichtigen Eingaben und schränken Sie die where-Klausel ein.
Annahme
Verfahren
Repository ändern
- Hinzufügen von *** JpaSpecificationExecutor *** in der zu durchsuchenden Repository-Schnittstelle
testRepository
@Repository
public interface TestRepository extends JpaRepository<TestEntity, Integer>, JpaSpecificationExecutor<TestEntity> {
}
- (Ergänzung) Das Repository ist ein Mechanismus zum Verwalten von Entitäten in einer Liste.
Vorbereitung der Spezifikationsklasse
- Suchbedingungen erstellen
- Diese Methode wird später als Suchbedingung verwendet
- Die Specification-Klasse spielt die Rolle der Suchbedingung, die in der where-Klausel verwendet wird.
testSpecifications
/**
*Wenn die Materiekategorie in der Suchbedingung vorhanden ist, fügen Sie sie der where-Bedingung hinzu
* @param anken_kbn
* @return
*/
public Specification<TestEntity> ankenKbnContains(String anken_kbn) {
if (Util.stringIsEmpty(anken_kbn))
return null;
else
return new Specification<TestEntity>() {
@Override
public Predicate toPredicate(Root<TestEntity> root, CriteriaQuery<?> query,
CriteriaBuilder cb) {
return cb.like(root.get("anken_kbn"), "%" + anken_kbn + "%");
}
};
}
--Dieser Teil erstellt eine teilweise Übereinstimmungssuche mit dem Element anken_kbn
- Bereiten Sie Methoden für die Bedingungen vor, die in einer Kette mit und oder oder verwendet werden sollen
»Hier sind noch andere
- Anken_name
- Rease_campany_name
Wir haben eine Methode, mit der Sie suchen können
--Wenn die in der Spezifikationsklasse vorbereitete Methode *** null zurückgibt, wird sie ignoriert *** und die Suche wird durchgeführt.
- ** Gibt den übergebenen Parameter anken_kbn ** mit Util.stringIsEmpty (anken_kbn) und ** null ** zurück, wenn anken_kbu ** leer ist **
--Wenn der Wert ** nicht leer ** ist, erstellen Sie eine ** Suchbedingung ** und geben das Objekt zurück.
Suche mit Spezifikation in Dao
- Suchbedingungen können in der Methodenkette festgelegt werden
- Zu diesem Zeitpunkt ist das Repository erforderlich. Definieren Sie also diese Methode, in die es injiziert werden kann, oder nehmen Sie in diesem Fall das in den Controller injizierte Repository-Objekt als erstes Argument und verwenden Sie es. ing
- Das zweite Argument, Form, enthält den vom Bildschirm übergebenen Wert.
- public List findBySearchItem(TestRepository testRepository,TestForm form
testDao
@Override
public List<TestEntity> findBySearchItem(TestRepository testRepository,TestForm form) {
TestSpecifications spec = new TestSpecifications();
List<TestEntity> result = TestRepository.findAll(Specifications.where(spec.ankenKbnContains(form.getAnken_kbn()))
.and(spec.ankenNameContains(form.getAnken_name()))
.and(spec.reaseCampanyNameContains(form.getRease_campany_name()))
);
System.out.println("Suchergebnisse");
System.out.println(result);
return result;
}
- Übergeben Sie das Suchbedingungsobjekt an den Parameter der findAll-Methode, die von der Repository-Schnittstelle bereitgestellt wird.
Specifications.where(spec.ankenKbnContains(form.getAnken_kbn()))
.and(spec.ankenNameContains(form.getAnken_name()))
.and(spec.reaseCampanyNameContains(form.getRease_campany_name()))
- Wie oben erwähnt, Bedingungen für die Kettensuche mit und Bedingungen usw.
- Die Spezifikation ist ein Objekt von Spezifikationen und verwendet die zuvor in dieser Klasse erstellte ankenKbnContains-Methode.
- Das nächste Formular zeigt den vom Bildschirm empfangenen Wert. Das wird zur Zeichenkette der Suchbedingung
Verwendung von Controler
- Fügen Sie in testListForm das Suchergebnis als Liste ein, die auf dem Bildschirm angezeigt werden soll.
--testDao wird injiziert
--testRepository wird injiziert
- Verwenden Sie Dao. Ich brauchte früher in Dao eine Instanz der Repository-Klasse, daher übergebe ich testRepository
testControleller
@RequestMapping("/search")
public ModelAndView search(@ModelAttribute("testListForm") TestListForm contractListForm,
ModelAndView mav) {
mav.setViewName("index");
Iterable<TestEntity> testEntityList = testDao.findBySearchItem(testRepository, testListForm);
System.out.println("Suchergebnisse");
System.out.println(tstEntityList);
mav.addObject("contractList", hdrEntityList);
mav.addObject("contractListF", new TestListForm());
return mav;
}
das ist alles
--Erstellte eine Variable where-Klausel durch Tappen
――Ist das eine gute Art zu schreiben? Es gibt vielleicht eine bessere Art zu schreiben, die ich nicht habe.