EntityManager, relacją do tabeli, błędny typ danych

0

Witam, mam problem z pobraniem danych z bazy MYSQL. Mam trzy tabele uzytkownik, produkt i koszyk, uzytkownik i produkt posiadają swoje klucz ID, do koszyka dodaje tylko wpis że uzytkownik o takim ID kupił produkt o takim ID i teraz z tej tabeli chce wyciągnąć wszystkie produkty użytkownika o imieniu takim a takim. Teoretycznie nic trudnego jednak EntityManager wyrzuca taki błąd

k - koszyk
p - produkt
u - uzytkownik

[62, 70] The state field path 'p.IdProduktu' cannot be resolved to a valid type.
[73, 82] The state field path 'k.IdProduktu' cannot be resolved to a valid type.
[87, 102] The state field path 'u.IdUzytkownik' cannot be resolved to a valid type.
[105, 121] The state field path 'k.IdUzytkownik' cannot be resolved to a valid type.
select p.nazwa from Produkt p ,Koszyk k ,Uzytkownik u where p.IdProduktu=k.IdProduktu and u.IdUzytkownik = k.IdUzytkownik and u.imie=:imie
@Entity
@Table(name = "Koszyk")
@XmlRootElement
public class Koszyk implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "IdKoszyk")
    private Integer IdKoszyk;
    @JoinColumn(name = "IdUzytkownik", referencedColumnName = "IdUzytkownik")
    @ManyToOne(optional = false)
    private Uzytkownik idUzytkownik;
    @JoinColumn(name = "IdProduktu", referencedColumnName = "IdProduktu")
    @ManyToOne(optional = false)
    private Produkt IdProduktu;

.....
@Entity
@Table(name = "Uzytkownik")
@XmlRootElement
public class Uzytkownik implements Serializable {
    

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "IdUzytkownik")
    private Integer idUzytkownik;
    @Basic(optional = false)
    @Column(name = "login")
    private String login;
    @Basic(optional = false)
    @Column(name = "imie")
    private String imie;

.....
@Entity
@Table(name = "Produkt")
@XmlRootElement
public class Produkt implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "IdProduktu")
    private Integer IdProduktu;

.....

Zdaje sobie sprawe że typy się tutaj nie zgadzają np w IdUzytkownika, w jednym integer w drugim Uzytkownik, jednak klasy te zostały wygenerowane przez netbeansa i jeśli zmienie oba typy na integer to Od razu wyrzuca że jest niezgodne z relacja itp.. Dlatego moje pytanie jak sobie z tym poradzić? może zapytanie źle jest skonstruowane, jednak na samej bazie zapytanie przechodzi a tutaj już nie.

0

Ale co ty chcesz zrobić? Bo na oko wygląda jakbyś chciał na pałe używać SQLa, a masz przecież ORMa. Nie tędy droga. Wywal te implicit joiny i whera z zapytania, są zupełnie zbędne. Przestań myśleć o tym jak to się mapuje na tabele w bazie! Wyobraź sobie że w ogóle o tym nie wiesz. Że wiesz tylko że w "jakiś sposób" w bazie przechowywany jest obiekt Koszyk a on w sobie zawiera inne obiekty. Ty sobie po prostu wyciągasz obiekty i tyle, a ich pola będą automatycznie inicjalizowane (jest tu pewna kwestia związana z EAGER i LAZY ale tym się w tej chwili nie przejmuj póki nie zrozumiesz idei).

0

no właśnie to jak takie coś zrobić? co chcesz zrobić:

Wyciągnąć z bazy wszystkie produkty które wrzucił do koszyka użytkownik o imieniu "Damian" np.

Bardzo bym prosił o nakierowanie albo danie jednego przykładowego rozwiązania

0

No więc chcesz wyciągnąć wszystkie koszyki Damiana a z nich pobrać produkty, tak? To tak też zrób. To będzie coś w stylu:

SELECT p FROM Koszyk k inner join k.idProduktu p inner join k.idUzytkownik u WHERE u.imie=:imie

BTW nazwanie tych pól "idProduktu" czy "idUżytkownik" jest mega mylące i absolutnie nie pownienieneś tak robić. Bo nie nie zadne ID tylko konkrenty obiekt i tyle.

0
SELECT p FROM Koszyk k INNER JOIN k.idProduktu p INNER JOIN k.idUzytkownik u WHERE u.imie=:imie

Wybacz ale nie do końca zrozumiałem te zapytanie

k.idProduktu p / k.idUzytkownik u <-- z czym sie je te p i u? w sensie do czego sie odnosi

Pisałeś także że celem ORM jest właśnie niemyślenie o takich rzeczach, możesz rozwinąć myśl ?

0

Równie dobrze zadziała ci

SELECT k.idProduktu FROM Koszyk k WHERE k.idUzytkownika.imie=:imie
0

Niestety ale w obu przypadkach dalej ten sam błąd przynajmniej w javie za to na bazie wywala że niewiem co to k.IdUzytkownika.imie

0

To są dwa różne typy zapytań: JPQL i SQL, więc nie porównuj błędów jakby miało Ci to pomóc.

0
Swr napisał(a):

To są dwa różne typy zapytań: JPQL i SQL, więc nie porównuj błędów jakby miało Ci to pomóc.

a to wiesz jak może wyglądać poprawne zapytanie do tego? bo już naprawde przejrzałem sporo internetu i nic nie działa

0

Podaj link do repo z tym kodem. Sklonuje sobie i zobaczę.

0

Ostatnie zapytanie które zrobiłem

SELECT u FROM Koszyt mu inner join Uzytkownicy u on (mu.IdUzytkownika = u.IdUzytkownika) WHERE u.imie =:imie";

już zmieniło chyba zrozumiało samą relacje jednak rzuca się o klucz Koszyka

Exception Description: The field [Koszyk.IdKoszyk] in this expression has an invalid table in this context.

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