Hibernate 5.2 Wyszukiwanie po numerze Id

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

@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

@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>();

2

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

SELECT p FROM Photo p JOIN p.user u  WHERE u.id=:id
 
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 :)

0

Obiektowe podejscie bez kombinacji

//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();
1

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

0
 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

0

No to trzeba zrobić fetch joina :D

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ń.

 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

0

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

0

DAO -SERVIS -CONTROLLER

Tak Lazy init

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1