spring jpa hibernate
lima-city → Forum → Programmiersprachen → Java
aussehen
beispiel
code
ergebnisliste
feld
genre
interface
klasse
list
machen
private list
private string
service
setter
springen
string
suche
tabelle
test
type
-
Ich habe mich etwas in Spring und Hibernate eingeschnuppert und gemerkt, dass Such/Filter anfragen mit "findBy.." relativ lange dauern, wenn man eine Suche über mehrere Felder einer richtig gut gefüllten Tabelle macht.
Der Grund wird vermutlich sein, dass die Felder der Datenbank nicht als Key-Felder deklariert sind. In vielen Beispielen die ich gefunden habe, hat die Tabelle auch nur ein einzelnes @Id Feld in der Entity Klasse.
Falls bekannt, kann mir jemand ein HowTo mit einem guten Beispiel zum performanten Suchen/Filtern einer großen Datenbanktabelle empfehlen? Es sollte nicht nur beschrieben sein, wie man ein find(id) auf ein einzelnes Id-Feld macht. Davon habe ich schon Beispiele gefunden :-)
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Was bedeutet "gut gefüllt"? 1.000 Einträge? 10.000 Einträge? 100.000 Einträge?
Lädst du ggf. Relationships mit, weil diese nicht als FetchType.LAZY markiert wurden? Hast du dir mal die generierten SQL-Statements angeschaut?
Wie genau sieht denn deine bisherige Abfrage aus?
Beitrag zuletzt geändert: 30.8.2016 13:26:34 von baris1892 -
Mit gut gefüllt meine ich schon sehr umfangreiche Tabellen mit 10.000 bis 100.000 Einträgen.
Eigentlich benutze ich Lazy bei meinen Attributen. Einfacher wäre es, wenn ich mir ein Beispiel anschaue, wie eine Suche auf eine große Tabelle in Spring richtig aussehen sollte.
Vielleicht gebe ich einfach mal Demo Entity Klassen und die unimplementierten Repository und Service Klassen an und ein erfahrener Entwickler zeigt, wie diese für eine möglichst performante Suche aussehen müssen? :-)
Die Ausgabe in der View würde z.B. wie folgt aussehen:
1. Der User kann nach dem Movie-Namen (Freitext), Genres (Checkbox) und Actors (Checkbox) suchen.
2. Die Ergebnisliste zeigt pro Zeile den Movie-Namen und die Genre-Tags z.B. Action, Comedy,.. (Ein Film kann mehr als nur einem Genre angehören)
3. Der Klick auf einen Eintrag aus der Ergebnisliste öffnet die Detailansicht mit allen Infos zum Film, d.h. Actors, Genres, Beschreibungen etc..
Movie.java
package test.entity; @Entity(name = "movie") public class Movie { @Id @GeneratedValue @Column(name = "movie_id") private Integer movieId; @Column(name = "name") private String name; @Lob @Type(type = "org.hibernate.type.StringClobType") @Column(name = "description", length = Integer.MAX_VALUE) private String description; @ManyToMany(fetch = FetchType.LAZY) @JoinTable private List<Genre> genres; @ManyToMany(fetch = FetchType.LAZY) @JoinTable private List<Actor> actors; /** Getter/Stetter **/ }
Genre.java
package test.entity; @Entity(name = "genre") public class Genre { @Id @GeneratedValue @Column(name = "genre_id") private Integer genreId; @Column(name = "name") private String name; @Column(name = "description") private String description; @ManyToMany(mappedBy = "genres", fetch = FetchType.LAZY) private List<Movie> movies; /** Getter/Setter **/ }
Actor.java
package test.entity; @Entity(name = "actor") public class Actor { @Id @GeneratedValue @Column(name = "actor_id") private Integer actorId; @Column(name = "name") private String name; @Column(name = "description") private String description; @ManyToMany(mappedBy = "actors", fetch = FetchType.LAZY) private List<Movie> movies; /** Getter/Setter **/ }
MovieRepository.java
package test.repository; public interface MovieRepository extends JpaRepository<Movie, Integer> { /* TODO */ }
GenreRepository.java
public interface GenreRepository extends JpaRepository<Genre, Integer> { /* TODO */ }
ActorRepository.java
public interface ActorRepository extends JpaRepository<Actor, Integer> { /* TODO */ }
MovieService.java
package test.service; @Service @Transactional public class MovieService { public List<Movie> findByMovieName(String movieName) { // TODO } public List<Movie> findByActors(List<Actor> actors) { // TODO } public List<Movie> findByGenres(List<Genre> genres) { // TODO } public List<Movie> findByActorsAndGenresAndMovieName(List<Actor> actors, List<Genre> genres, String MovieName) { // TODO } }
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage