Hirdetés

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

  • togvau
    senior tag

    Namost ez egy elég hosszú téma, de röviden itt van egy példa, ami alapján tudsz hozzácsapni összetetteb dolgokat egy JPA repo-hoz. Ezt most csak egy text editorban dobtam össze, de a lényeg itt van. Van egy JPA repository-d, amit a framework majd implementál magának. Kell egy új interface, amiben a saját új metódusaid vannak. Ezt implementálod egy külön osztályban, valamint az új interface-t hozzácsapod a JPA repo-hoz az extends-ben. Innentől kezdve a PhotosRepo típust injektálod be mindenhová, mert a Spring ez alapján készít saját implementációt.

    // létrehozol egy inteface-t a saját metódusaidnak
    public interface PhotosRepoCustom {...}

    // meghagyod a Spring Data repository-dat is, de hozzácsapod a saját interface-t is
    @Repository
    public interface PhotosRepo extends CrudRepository<Photo, Long>, PhotosRepoCustom {...}

    // implementálod az új interface-t
    public class PhotosRepositoryImpl implements PhotosRepoCustom {
        @PersistenceContext
        EntityManager em;
        public List<A> findAllCustom() {
            ....
        }
    }

    De a @Query annotációval használhatsz JOIN FETCH-et is egy query metódusban pl.:
    @Repository
    public interface PhotosRepo extends CrudRepository<Photo, Long> {
        ...
        @Query("SELECT a FROM A a INNER JOIN FETCH a.b b")
        public List<A> find();
    }

    Jaj de bonyolult, és csúnya. DeltaSpike-nál létre lehetett hozni interfacet extends EntityRepository, ahol csak @Query elég volt, ahol meg vegyesen kellett @query, és rendes metódus is, ott abstract class extends AbstractFullEntityRepository, aztán abstract metódusnál csak @query, nem abstractnál meg minden más.

    Vannak bajok ezzel a spring datával, belefutottam ebbe is [link], csak sima long-al. Akkor jön elő, ha entity kapcsolat van 2 tábla között. Bár a kapcsolat DB szinten sima id-kkel van meg (bigint-ek), id alapján queryben mégse lehet szűrni, mert bár a query paraméter long, ami jó a biginthez, de spring data azt már entity-nek látja, amivel nem stimmel a long...
    Akkor lehet választani, hogy vagy entity szintű kapcsolatok, vagy optimalizált lekérdezések... bár criteriaqueryvel nem próbáltam még.

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