JPQL - select z relacji one to many

0

Witam,
Mam klasę Project i Report, relacja między nimi to jeden do wielu jednokierunkowa. Projekt może mieć wiele raportów.
jpql.png

Kod:

	public List getTest(long idProject) {
		List<Report> reports = null;
		try {
			if (!entityManager.getTransaction().isActive()) {
				entityManager.getTransaction().begin();
			}
			TypedQuery<Report> typedQuery = entityManager.createQuery(
					"select r from Report r, Project p where p.id = :id", Report.class);
			typedQuery.setParameter("id", idProject);
			reports = typedQuery.getResultList();

			entityManager.getTransaction().commit();
			return reports;
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			entityManager.getTransaction().rollback();
			return null;
		}
	} 
 
                List<Report> reports = dBreport.getTest(1L);
                for(Report r :reports){
                    System.out.println(r.getTitle());
                }

Wypisze:

 
r1
r2

A powinno wypisać samo r1.

W sql to wyglądałoby tak:

SELECT * FROM mojabaza.Report where Project_idProject =1; 

Jak to zapisać w JPQL albo z criteria api?

0

Zrobiles kartezjana, czyli wszystko z wszystkim, i pozniej filtrujesz. Po kolei:

select r from Report r, Project p

tworzy taka powiedzmy tabelke:

id | projektId

1 | 1
1 | 2
2 | 1
2 | 2

Teraz jak dasz warunek projektId=1 to widzisz ze zwraca 2 raporty: 1 i 2.

0

Może coś takiego? Nie możesz z Report odwołać się do id projekt?

"SELECT r FROM Report r WHERE r.Project_idProject = :id"
0

@olek1 niestety tak nie można dostaję wyjątek.
Po kilkunastu próbach działa takie coś:

 
"select r from Report r JOIN r.project where r.project.id=:id", Report.class);
0

Ale to robi niepotrzebnego joina i nie jest do konca tym samym co twoj sql. Dlaczego? Bo jesli masz raporty bez projekty to inner join tych raportow nie zwroci - nie wiem czy jest taka mozliwosc u ciebie.

Zeby zrobic tak jak masz w sql, musialbys zrobic tak jak powiedzial poprzednik, tylko inaczej pewnie nazywa sie twoje zmapowane property w jpql, pewnie nie r.project_idProject, ale jak sie nazywa to wiesz tylko ty (albo pokaz XML/adnotacje JPA).

1

Wywala wyjątek bo masz ustawioną inicjalizację leniwą, tzn. że zbiór Projekt jest pobierany z opóźnieniem. Należy wtedy zastosować join fetch jeśli chcesz aby zwróciło Ci Report wraz z załadowanymi Projektami, lub tak jak zrobiłeś samemu powyżej. Tylko, że w twoim przypadku dostajesz Report bez załadowanych Projektów.

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