私はスプリングブート(1.3.5)、スプリングデータ、スプリングデータjpa、JPA(hibernate/hsqldb)を使用します。スプリングデータjpaページングソートエラー
コード:
POM:
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
構成用コード:
@Bean
public PageableHandlerMethodArgumentResolver pageableHandlerMethodArgumentResolver(
SortHandlerMethodArgumentResolver sortHandlerMethodArgumentResolver) {
PageableHandlerMethodArgumentResolver phmar = new PageableHandlerMethodArgumentResolver(
sortHandlerMethodArgumentResolver);
phmar.setOneIndexedParameters(false);
phmar.setPageParameterName("page");
phmar.setSizeParameterName("size");
phmar.setMaxPageSize(20);
return phmar;
}
@Bean
public SortHandlerMethodArgumentResolver sortHandlerMethodArgumentResolver() {
SortHandlerMethodArgumentResolver shmar = new SortHandlerMethodArgumentResolver();
shmar.setSortParameter("sort");
return shmar;
}
コントローラ:
@RequestMapping(value = { "/List", "" })
public String list(Model model, @RequestParam(required = false) String searchString,
@SortDefault(sort = "code", direction = Direction.ASC) @PageableDefault(page = 0, size = 20) Pageable pageable) {
Iは
を試します@PageableDefault(page = 0, size = 20, sort = "code", direction = Direction.ASC)
でも動作しません。
Page<T> page;
if (!isEmpty(searchString))
page = service.search(searchString, pageable); // <-- ERROR
else
page = service.findAll(pageable); // <-- OK
サービス(簡体字):
@Override
@Transactional(readOnly = true)
public Page<T> search(String str, Pageable pageable) {
return repository.search(str, pageable);
}
リポジトリ(簡体字):
@Repository
public interface EntityRepository extends JpaRepository<T, Integer> {
(...)
@Query(value = "SELECT a FROM #{#entityName} a WHERE a.code LIKE CONCAT('%', :str, '%') OR UPPER(a.name) LIKE UPPER(CONCAT('%', :str, '%'))")
Page<T> search(@Param("str") String str, Pageable pageable);
私は同じ@Query
whithてみたがPageable pageable
パラメータなしintead List<>
Page<>
を返し、それこれと一緒に使える@Query
テスト:
@Query(value = "SELECT a FROM #{#entityName} a WHERE a.code LIKE CONCAT('%', :str, '%') OR UPPER(a.name) LIKE UPPER(CONCAT('%', :str, '%'))")
List<T> search(@Param("str") String str);
私はそれが動作しますが、私は(STR = "AT")search(str, pageable)
を呼び出すとき、それは動作しませんfindAll(pageable)
呼び出します。
ブラウザ出力:
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Wed May 25 15:16:24 CEST 2016
There was an unexpected error (type=Internal Server Error, status=500).
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: : near line 1, column 151 [SELECT a FROM prueba.entity.AccountType a WHERE a.code LIKE CONCAT('%', :str, '%') OR UPPER(a.name) LIKE UPPER(CONCAT('%', :str, '%')) order by a.code: ASC asc]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: : near line 1, column 151 [SELECT a FROM prueba.entity.AccountType a WHERE a.code LIKE CONCAT('%', :str, '%') OR UPPER(a.name) LIKE UPPER(CONCAT('%', :str, '%')) order by a.code: ASC asc]
SQLは無効です!エクストラ ":"と "ASC asc"を複製します。
コンソール出力:
Hibernate:
select
count(accounttyp0_.id) as col_0_0_
from
account_type accounttyp0_
where
accounttyp0_.code like ('%'||?||'%')
or upper(accounttyp0_.name) like upper(('%'||?||'%'))
mo.h.hql.internal.ast.ErrorCounter line 1:151: unexpected token: :
mo.h.hql.internal.ast.ErrorCounter line 1:151: unexpected token: :
antlr.NoViableAltException: unexpected token: :
at org.hibernate.hql.internal.antlr.HqlBaseParser.atom(HqlBaseParser.java:3694) [hibernate-core-4.3.11.Final.jar:4.3.11.Final]
(more and more)
near line 1, column 151 [SELECT a FROM prueba.entity.AccountType a WHERE a.code LIKE CONCAT('%', :str, '%') OR UPPER(a.name) LIKE UPPER(CONCAT('%', :str, '%')) order by a.code: ASC asc]; nested exception is java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: : near line 1, column 151 [SELECT a FROM prueba.entity.AccountType a WHERE a.code LIKE CONCAT('%', :str, '%') OR UPPER(a.name) LIKE UPPER(CONCAT('%', :str, '%')) order by a.code: ASC asc]] with root cause
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: : near line 1, column 151 [SELECT a FROM prueba.entity.AccountType a WHERE a.code LIKE CONCAT('%', :str, '%') OR UPPER(a.name) LIKE UPPER(CONCAT('%', :str, '%')) order by a.code: ASC asc]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxExcept ion.java:91) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
現在、それが原因不足しているコードブロック、半分のコードブロックと書式設定の問題に読めない、あなたの質問を構造化してフォーマットしてください。 –
申し訳ありません。今はまし? –