Пользовательские запросы SQL и Spring Data JPA - PullRequest
0 голосов
/ 05 октября 2018

Как писать собственные запросы в Spring Data JPA? Есть ли более удобный метод, чем следующий?Раньше я делал так:

public class TestCustomRepositoryImpl implements TestCustomRepository {

    @PersistenceContext
    private EntityManager entityManager;


    @Override
    public Double getValue(Long param) {
        // Simple SQL query for example.
        String queryString = "SELECT column_name1 FROM table_name1 " 
             + "WHERE column_name2 = " + param;
        Query query = entityManager.createNativeQuery(queryString);

        List resultList = query.getResultList();
        if (!resultList.isEmpty()) {
            Number value = (Number) resultList.get(0);
            if (value != null) {
                return value.doubleValue();
            }
        }

        return 0.0;
    }
}

Затем я добавил пользовательский интерфейс в свой репозиторий JPA:

public interface TestRepository extends JpaRepository<TestEntity, Long>, TestCustomRepository {

}

Есть ли более удобный способ?Могу ли я использовать Spring Data для CRUD и реализовать TestCustomRepository с MyBatis, например? Как вы реализуете свои собственные методы?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

в TestRepository вы можете использовать DTO с помощью SELECT NEW и передавать объект DTO:

@Query("SELECT NEW com.app.domain.EntityDTO(table.id, table.col2, table.col3)
FROM Table table")
public List<EntityDTO> findAll();

В этом примере ваш DTO должен иметь конструктор с этими 3 параметрами.

ЕслиВы хотите выбрать свойства, которые вы можете просто использовать:

@Query("SELECT table.id)
FROM Table table")
public List<Long> findAllIds();
0 голосов
/ 05 октября 2018
You can write the native query in the repository like this:

1)
@Query("SELECT t.column_name1 FROM table_name1 t WHERE t.column_name2 =:param")
List<String> getValue(@Param("param") String param);

OR

2)@Query("SELECT t.column_name1 FROM table_name1 t WHERE t.column_name2 = 'param'", nativeQuery=true)
List<String> getValue();

Or you can use NamedQuery and add the query in the model only.
for eg: 
@Entity
@Table(name = "table_name1", schema="db_name")
@NamedQuery(name = "ENTITY.fetchParam",
        query = "SELECT t.column_name1 FROM table_name1 t WHERE t.column_name2 =:param "
)
public class Employee {
}

And have same method in the repository like:
@Repository
public interface TestRepository extends JpaRepository<Employee,Long>, TestRepositoryCustom {

    List<String> fetchParam(@Param("param") String param);
}
...