Hirdetés

Keresés

Új hozzászólás Aktív témák

  • floatr
    veterán

    Most kellett :)
    Linkeltem fent a bugot, ami valahol van... exception alapján spring data-ban van, de a workaround az egy criteriaquery, aminél nem jelentkezik ugyan az a bug:

    @Query("select p.id from Photo p where p.user = ?1")
    List<Long> findIdsByUserId(long id, boolean restricted);
    Ez elhasal, a linkelthez hasonló: org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [34] did not match expected type... -al

    Míg ugyan az a lekérdezés (kicsit még kibővítve), criteriaqueryvel, ugyan olyan metódusparaméterekkel, fut ahogy kell:
     public List<Long> findIdsByUserId(long id, boolean restricted) {
      var cb= em.getCriteriaBuilder();
      var ids=cb.createQuery(Long.class);
      var root=ids.from(Photo.class);
      ids.select(cb.construct(Long.class, root.get("id")));
      var pred= new ArrayList<Predicate>();
      pred.add(cb.equal(root.get("user"), id));
      if (!restricted) pred.add(cb.equal(root.get("restricted"), false));
      ids.where(pred.toArray(new Predicate[pred.size()]));
      return em.createQuery(ids).getResultList();
     }

    fura. user= User entity kapcsolat, ami DB-ben egy BIGINT-et jelent user_id mezőben.

    Nézd nem mondom, hogy hibátlan a framework. Tele van apróbb hiányosságokkal, dokumentálatlan sok helyen, és a dobott hibák félrevezetőek.
    De ha alaposan ismered, nem csupán a tutorialokat bújod, akkor fel fogod ismerni az alapvető összefüggéseket. A fenti lazy init probléma nem bug. Így működik a JPA, és ha a @Transactional használata problémát okoz, akkor nagyon gyorsan igyekezz elsajátítani, mert mint mondtam: alap.

    Az iménti kódrészlettel van egy baromi nagy baj, nem is csupán a paraméterek száma miatt. A query, amit leírtál, egy JPQL SELECT. Annyiban különbözik az SQL-től, hogy objektumokat kezel (többek között). A p.user=?1 nem a táblában lévő oszlopra vonatkozik, hanem a Photo entitás user adattagjára, ami gondolom User típusú. A JPQL nem long értéket vár, hanem egy User objektumot. Helyesen így lenne:
    select p.id from Photo p where p.user.id = ?1
    feltételezve, hogy a user azonosítója az id nevű property, így lehetne Long paraméterrel hívni. A restricteddel az a baj, hogy feltételesen csapod a query-hez a criteria API-s implementációjával. Ilyet @Query annotációval nem lehet. Ott fixen meg kell adni a JPQL-t, amit nem módosíthatsz, magyarán:
    select p.id from Photo p where p.user.id = ?1 and p.restricted=?2
    lenne a végső JPQL (ha el nem néztem még valamit).

    Ne ess abba a hibába, hogy a frameworkben keresed a bugot, miközben helytelenül kódolsz.

  • Drizzt
    nagyúr

    Most kellett :)
    Linkeltem fent a bugot, ami valahol van... exception alapján spring data-ban van, de a workaround az egy criteriaquery, aminél nem jelentkezik ugyan az a bug:

    @Query("select p.id from Photo p where p.user = ?1")
    List<Long> findIdsByUserId(long id, boolean restricted);
    Ez elhasal, a linkelthez hasonló: org.springframework.dao.InvalidDataAccessApiUsageException: Parameter value [34] did not match expected type... -al

    Míg ugyan az a lekérdezés (kicsit még kibővítve), criteriaqueryvel, ugyan olyan metódusparaméterekkel, fut ahogy kell:
     public List<Long> findIdsByUserId(long id, boolean restricted) {
      var cb= em.getCriteriaBuilder();
      var ids=cb.createQuery(Long.class);
      var root=ids.from(Photo.class);
      ids.select(cb.construct(Long.class, root.get("id")));
      var pred= new ArrayList<Predicate>();
      pred.add(cb.equal(root.get("user"), id));
      if (!restricted) pred.add(cb.equal(root.get("restricted"), false));
      ids.where(pred.toArray(new Predicate[pred.size()]));
      return em.createQuery(ids).getResultList();
     }

    fura. user= User entity kapcsolat, ami DB-ben egy BIGINT-et jelent user_id mezőben.

    Igy ranezesre: ket fuggveny parametered van, mig a querynek csak 1. A @Queryben jpql expression van. Ha a user id-jere akarsz szurni, akkor: where p.user.userId =?

Új hozzászólás Aktív témák