Hibernate 5.2 Wyszukiwanie po numerze Id

Hibernate 5.2 Wyszukiwanie po numerze Id
BB
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:34
0

Witam

Mam problem ze stworzeniem metody za pomocą Hibernate w podanej wersji która zwraca listę zjęć według numeru Id użytkownika w relacji many to one.
Jedna osoba może mieć kilka zdjęć i chodzi o to żeby wyszukać zdjęcia według id danej osoby.

prosiłbym o przykład przy użyciu criteriabuilder i zwykłego jpa query. :)

Albo udaje mi się ze zwraca wszystkie zdjęcia niezależnie od osoby albo tylko jedno zdjęcie od osoby która wybiorę.

Klasa 1

Kopiuj
@Entity
public class Photo {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;
	private String name;
	private String type;
	private String description;
	@Lob @Basic(fetch = FetchType.LAZY)
	private byte[] content;
	@ManyToOne(optional = false)
	@JoinColumn(name = "person_id")
	private Person person;

Klasa 2

Kopiuj
@Entity
@Table(name="persons")
public class Person {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private long id;
	private String name;
	private int age;
	@OneToMany(mappedBy = "person", cascade = CascadeType.ALL)
    private Set<Photo> Photos = new HashSet<Photo>();

S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:7 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
2

Chcesz po prostu pobrać encje Photo po id Usera?
CriteriaBuilder to teraz nie wiem, ale JPQL to powinno być coś w stylu:

Kopiuj
SELECT p FROM Photo p JOIN p.user u  WHERE u.id=:id
 

"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
edytowany 1x, ostatnio: scibi92
BB
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:34
0

Tak Photo po id usera z tym że user może mieć kilka zdjęć. Dzięki serdeczne w domu sprawdze czy działa i doczytam co i jak :)

Metoda w crieria builiderze też mile widziana :)

KE
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 7 lat
0

Obiektowe podejscie bez kombinacji

Kopiuj
//mozesz uzyc po staremu metody load, find albo get w tym wypadku raczej nie ma potrzeby aby uzywac
Person person = entityManager.getReference(Person.class, personId);
Set<Photo> photos = person.getPhotos();
edytowany 3x, ostatnio: kemot
Koziołek
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:6 dni
  • Lokalizacja:Stacktrace
  • Postów:6822
1

@kemot tak bardzo obiektowo, że aż strach. Po czymś takim masz problem N+1 i leniwe ładowanie całej kolekcji.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
jarekr000000
Napisał kilka zdjeć - (kilka + 1) -to nie jest problem.
SP
@jarekr000000: raczej 1+1 jeśli będziemy wyświetlać zdjęcia tylko jednego użytkownika
KE
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 7 lat
0
Kopiuj
 Person person = entityManager.find(Person.class, personId);
Set<Photo> photos = person.getPhotos();

to na pewno jest N+1, ale wydawało mi sie ze z uzyciem getReference raczej nie powinno byc, sprawdze, moze i masz racje bo pewnie w tmtym podejsciu sprawdza czy encja istnieje aczkolwiek nie mam 100% pewnsci ze jest jak piszesz

S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:7 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

No to trzeba zrobić fetch joina :D


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
Koziołek
czyli sprowadzamy problem do pisania zapytania z palca...
FI
filemonczyk
skoro nie fetch to moze entity graph?
BB
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:34
0

Nieładnie zapomniałem odpisać

Początkowo stworzyłem metodę na podstawie postu scibi92 aczkolwiek po czasie pojawił się "LazyInitializationException" najlepszym rozwiązaniem wdg. tego co wyszukałem to zastosowanie Join fetch ktory zapobiega N+1 w przeciwieństwie do innych rozwiązań.

Kopiuj
 public List<Photo> findAllByUserId(long userId) {
		Session session = this.sessionFactory.openSession();
		List<Photo> photos = session.createQuery("SELECT p " +
			    "FROM Photo p " +
			    "JOIN FETCH p.user  WHERE p.id=:userId"
			    , Photo.class ).setParameter("userId", userId).getResultList();
		session.close();
		
		return photos;
		
    }

Można to zrobić na podstawie CriteriaBuilidera ale na razie to mi wystarczy :)

Dziękuję za pomoc i podpowiedzi
Pozdrawiam

edytowany 1x, ostatnio: BartBas
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:7 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

Lazy Init?
To zaraz gdzie Ty ładujesz te obiekty?
Jak wygląda architektura, DAO wstrzykujesz bezpośrednio do Controllerów?


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
Koziołek
Open session in view, albo wrocławska szkoła "Encja na twarz i pchasz". Czasami przydatne.
BB
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 8 lat
  • Postów:34
0

DAO -SERVIS -CONTROLLER

Tak Lazy init

edytowany 2x, ostatnio: BartBas
0

A jak z transakcjami robisz? I czy stosujesz obiekty DTO :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.