Basic CRUD Web Aplikasi Menggunakan SpringFramework-MVC, Freemarker, Hibernate dan JPA - Spring JPA Repository Class

Article Index

Spring JPA Repository Class

JPA Repository class merupakan interface untuk mengakses database melalui JPA. Pada repository interface ini kita dapat menempatkan JPQL (Java Persistence Query Language) dan beberapa annotasi lainnya yang diperlukan untuk mengakses database.

Spring-Data-JPA telah mempermudah kita mengakses JPA API dan Hibernate API melalui repository interface ala Spring. Kita tidak dipusingkan bagaimana menggunakan JPA dan Hibernate API agar kita dapat mengakses database dan melakukan operasi CRUD pada MySQL database.

Selanjutnya marilah kita membuat class Repository Interface. Pada Project Explorer pilih package org.fajarapps.jpacrud, lalu pilih popup menuitem: New -> Package, dan namai dengan repository. Selanjutnya pilih package org.fajarapps.jpacrud.repository dan pada popup menuitem: New -> Java Class, buat interface baru dan namai dengan IDepartmentRepository.

Berikut ini source code IDepartmentRepository.java:

package org.fajarapps.jpacrud.repository;

/* import ... tidak ditampilkan */

public interface IDepartmentRepository extends PagingAndSortingRepository<Department, Integer>
{
    /**
     * Menampilkan daftar departemen.
     *
     * @param sort Sorting method
     * @return The slice collection or data-paging collection of Department object.
     */
    @QueryHints(value = {@QueryHint(name = "org.hibernate.cacheable", value = "true")})
    Iterable<Department> findAll(Sort sort);

    /**
     * Menampilkan daftar departemen dan jumlah employee per-departemen.
     *
     * @param pageable Paging and sorting method
     * @return The slice collection or data-paging collection of Department object.
     */
    @QueryHints(value = {@QueryHint(name = "org.hibernate.cacheable", value = "true")})
    @Query("SELECT new Department(d.deptId, d.deptName, d.description, COUNT(p.personId) AS numberOfPerson) " +
            "FROM Department d LEFT JOIN d.persons p GROUP BY d.deptId")
    Page<Department> listAllWithStats(Pageable pageable);

}

Class interface IDepartmentRepository ini diperlukan untuk mengakses table department ataupun JPA-entity Department. Kita dapat melakukan operasi CRUD terhadap table department melalui class interface ini.

Dengan cara yang sama, kita buat class interface baru yakni: IPersonRepository. Class interface ini diperlukan untuk mengakses table person ataupun JPA-entity Person dan melakukan operasi CRUD terhadap table person.

Berikut ini source code IPersonRepository.java:

package org.fajarapps.jpacrud.repository;

/* import ... tidak ditampilkan */

public interface IPersonRepository extends PagingAndSortingRepository<Person, Long>
{
    /**
     * Menampilkan daftar personil dengan menggunakan field 'department' sebagai filter kriteria pencarian.
     *
     * @param department Object kriteria filter
     * @param pageable   Paging and sorting method
     * @return The slice collection or data-paging collection of Person object.
     */
    @QueryHints(value = {@QueryHint(name = "org.hibernate.cacheable", value = "true")})
    @Query("SELECT p FROM Person p JOIN p.department d WHERE d = :dept")
    Page<Person> findByDepartement(@Param("dept") Department department, Pageable pageable);

    /**
     * Menampilkan daftar personil dengan menggunakan field 'department' dan 'fullname'
     * sebagai filter kriteria pencarian.
     *
     * @param department Object kriteria filter
     * @param term       String term pencarian
     * @param pageable   Paging and sorting method
     * @return The slice collection or data-paging collection of Person object.
     */
    @QueryHints(value = {@QueryHint(name = "org.hibernate.cacheable", value = "true")})
    @Query("SELECT p FROM Person p JOIN p.department d WHERE d = :dept AND p.fullname LIKE :term")
    Page<Person> findByDepartementAndTerm(@Param("dept") Department department, @Param("term") String term,
                                          Pageable pageable);

    /**
     * Menampilkan daftar personil dengan menggunakan field 'fullname' sebagai filter kriteria pencarian.
     *
     * @param term     String term pencarian
     * @param pageable Paging and sorting method
     * @return The slice collection or data-paging collection of Person object.
     */
    @QueryHints(value = {@QueryHint(name = "org.hibernate.cacheable", value = "true")})
    @Query("SELECT p FROM Person p WHERE p.fullname LIKE :term")
    Page<Person> findByTerm(@Param("term") String term, Pageable pageable);

    /**
     * Menampilkan daftar personil.
     *
     * @param pageable Paging and sorting method
     * @return The slice collection or data-paging collection of Person object.
     */
    @QueryHints(value = {@QueryHint(name = "org.hibernate.cacheable", value = "true")})
    Page<Person> findAll(Pageable pageable);
}