OPIS PROBLEMU
Chciałbym zrobić menadżera plików. Mam dwie encje:
-
DirectoryEntity, która reprezentuje folder - encja jest powiązana sama ze soba na zasadzie dziecko-rodzic po to aby uzyskać strukture drzewiastą, podkatalogi itd. Ponadto każdy folder może zawierać wiele plików (relacja 1:n z encja FileEntity)
-
FileEntity - reprezentuje plik
Załóżmy teraz, że chce wyświetlić listę plików z obsługą stronnicowania. W tym celu mogę sobie napisać metodę w repozytorium, której kod jest następujący:
@Query("select f.id, f.name from com.entity.media.FileEntity f")
Page<Object[]> findFiles(Pageable pageable);
Wszystko działa ok, ale normalnie powinienem wyświetlić zarówno foldery jak i pliki. Najprościej byłoby użyć unii i zmodyfikować metodę do postaci:
@Query("select d.id, d.name from com.entity.media.DirectoryEntity d " +
"union all select f.id, f.name from com.entity.media.FileEntity f")
Page<Object[]> findFilesAndDirectories(Pageable pageable);
Problem tylko w tym, że Hibernate, którego używam najwyrażniej nie obsługuje unii.
PRÓBY ROZWIĄZANIA PROBLEMU
Pomyślałem sobie, że problem obejdę tworząc widok w swojej bazie danych (PostgreSQL) i... nie myliłem się. Stworzyłem sobie widok:
CREATE VIEW media_view AS
select id, name from media_directories
union all
select id, name from media_files
oraz encję
@Entity(name = "media_view")
public class MediaView {
@Id
private Long id;
@Column(name = "name")
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
I w swoim repozytorium mam teraz metodę
@Query("select m.id, m.name from media_view m")
Page<Object[]> findFilesAndDirectories(Pageable pageable);
Działa jak trzeba... ale problem w tym, że w wersji rozwojowej tabele są usuwane i tworzone na nowo podczas startu aplikacji (opcja "hbm2ddl.auto" ustawiona na "create") a co za tym idzie zostanie utworzona tabela media_view przez co trudno utworzyć widok o tej samej nazwie.
PYTANIA
- Czy można pominąć tworzenie tabeli dla encji MediaView?
- Czy można podmienić zapytanie SQL, które tworzy tabelę dla tej akurat encji (wtedy umieściłbym tam zapytanie, które tworzy widok).?
- Czy można problem rozwiązać inaczej? Jak?