Я пытаюсь включить Spring-Data-JPA в свой проект. Меня смущает одна вещь: как добиться setMaxResults (n) с помощью аннотации?
например, мой код:
public interface UserRepository extends CrudRepository<User , Long>
{
@Query(value="From User u where u.otherObj = ?1 ")
public User findByOhterObj(OtherObj otherObj);
}
Мне нужно только вернуть one (and only one)
User из otherObj, но я не могу найти способ аннотировать maxResults. Кто-нибудь может мне намекнуть?
(mysql жалуется:
com.mysql.jdbc.JDBC4PreparedStatement@5add5415: select user0_.id as id100_, user0_.created as created100_ from User user0_ where user0_.id=2 limit ** NOT SPECIFIED **
WARN util.JDBCExceptionReporter - SQL Error: 0, SQLState: 07001
ERROR util.JDBCExceptionReporter - No value specified for parameter 2
)
Я нашел ссылку: https://jira.springsource.org/browse/DATAJPA-147 , попробовал, но не удалось. Кажется, сейчас это невозможно? Почему такая важная функция не встроена в Spring-Data?
Если я реализую эту функцию вручную:
public class UserRepositoryImpl implements UserRepository
Мне нужно реализовать множество предопределенных методов CrudRepository
, это было бы ужасно.
среды: Spring-3.1, Spring-data-jpa-1.0.3.RELEASE.jar, Spring-data-commons-core-1.1.0.RELEASE.jar
источник
List
в качестве возвращаемого типа метода.Top
аFirst
ключевые слова неприменимы к методам, использующим@Query
аннотации? Только те, которые используют генерацию запросов на основе имени метода?Если вы используете Java 8 и Spring Data 1.7.0, вы можете использовать методы по умолчанию, если хотите объединить
@Query
аннотацию с установкой максимальных результатов:источник
Stream<User> ... {...} default Optional<User> ... { ...findAny() }
Существует способ предоставить эквивалент «setMaxResults (n) по аннотации», как показано ниже:
Это должно сработать, когда страница отправляется как параметр. Например, чтобы получить первые 10 записей, вам нужно установить pageable для этого значения:
источник
List
работает отлично (и позволяет избежать ненужныхcount
запросов, как уже упоминалось в предыдущем комментарии )Используйте Spring Data Evans (ВЫПУСК 1.7.0)
новый выпуск Spring Data JPA с другим списком модулей вместе под названием Evans имеет функцию использования ключевых слов
Top20
иFirst
ограничения результата запроса,чтобы ты мог написать
или
или для единственного результата
источник
Pageable
объект. ознакомьтесь с весенней документациейЛучший выбор для меня - это собственный запрос:
источник
nativeQuery
добавлен параметр аннотации JPA, который нельзя игнорировать.Если ваш класс
@Repository
расширяется,JpaRepository
вы можете использовать приведенный ниже пример.getContent вернет a
List<Transaction>
.источник
Также возможно использование @QueryHints. В приведенном ниже примере используется org.eclipse.persistence.config.QueryHints # JDBC_MAX_ROWS
источник
@QueryHints({@QueryHint(name = org.hibernate.annotations.FETCH_SIZE, value = "1")})
в Hibernate, но псевдоним :( не работаетnew PageRequest(0,10)
не работает в более новых версиях Spring (я использую2.2.1.RELEASE
). По сути, конструктор получил дополнительный параметр какSort
тип. Более того, конструктор таков,protected
что вам нужно либо использовать один из его дочерних классов, либо вызывать егоof
статический метод:Вы также можете не использовать
Sort
параметр и неявно использовать сортировку по умолчанию (сортировку по pk и т. Д.):Объявление вашей функции должно быть примерно таким:
и функция будет:
источник