Подтвердить что ты не робот

Как сократить имена методов запросов в Spring Хранилищах данных JPA?

Рассмотрим репозиторий данных Spring Data Jpa:

public interface UserRepository extends JpaRepository<User, Long> {

    User findOneByDeletedIsFalseAndActivationKey(String activationKey);

    List<User> findAllByDeletedIsFalseAndActivatedIsFalseAndCreatedDateBefore(DateTime dateTime);

    User findOneByDeletedIsFalseAndLogin(String login);

    User findOneByDeletedIsFalseAndEmail(String email);

}

Обратите внимание, что у каждого метода есть "DeletedIsFalse". Есть ли простой способ сделать имена методов короче? Как и т.д.:

@FullMethodName("findOneByDeletedIsFalseAndEmail")
User findOneByEmail(String email);
4b9b3361

Ответ 1

Используйте default функцию Java 8 для обертывания, так же:

// use findOneByEmail instead
User findOneByDeletedIsFalseAndEmail(String email);

default User findOneByEmail(String email) {
    return findOneByDeletedIsFalseAndEmail(email);
}

См. пример.

Ответ 2

Нет такого пути. Вы можете указать любое имя для метода и добавить аннотацию @Query с значением параметра, которая содержит требуемый запрос в базу данных следующим образом:

@Query(value="select u from User u where u.deleted=false and u.email=:email")
User findOneByEmail(@Param("email")String email);

или, с собственным запросом sql:

@Query(value="SELECT * FROM users WHERE deleted=false AND email=?1", nativeQuery=true)
User findOneByEmail(String email);

Вы также можете использовать имена, соответствующие правилам именования для запросов, поскольку аннотация @Query будет иметь приоритет над запросом из имени метода.

@Документы запроса

Upd:

из Spring docs:

Хотя получение запроса, полученного из имени метода, довольно удобно, можно столкнуться с ситуацией, в которой... имя метода получило бы ненужное уродство. Таким образом, вы можете использовать JPA именованные запросы с помощью соглашения об именах... или, скорее, аннотировать ваш метод запроса с помощью @Query.