18

これはばかげていると確信しているので、簡単な質問です。NetBeans sql コマンド ウィンドウで実行できる次のクエリがあります。

SELECT TOP 25 * FROM ARCUST_BIG  WHERE arcustno<='300000' ORDER BY arcustno DESC

私の目標は、それを ArcustRepository クラスに入れることです。

public interface ArcustRepository extends JpaRepository {

Arcust findByPrimaryKey(String id);

@Query("SELECT COUNT(a) FROM Arcust a")
Long countAll();

@Query("SELECT TOP 25 a FROM Arcust a WHERE a.arcustno<='?1' ORDER BY a.arcustno DESC")
List<Arcust> findByTop(String arcustno);
}

ただし、その findBytop クエリは機能していないようで、tomcat7 でサービスを開始すると、次のように返されます。

2013-08-15 08:15:20 ERROR ContextLoader:319 - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'arcustService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.waudware.pics.repository.ArcustRepository com.waudware.pics.service.ArcustService.arcustRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'arcustRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List com.waudware.pics.repository.ArcustRepository.findByTop(java.lang.String)!
Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract java.util.List com.waudware.pics.repository.ArcustRepository.findByTop(java.lang.String)!
Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: 25 near line 1, column 12 [SELECT TOP 25 a FROM com.waudware.pics.domain.Arcust a WHERE a.arcustno<='?1' ORDER BY a.arcustno DESC]
4

7 に答える 7

19

私はあなたが必要だと言うでしょう

List<Arcust> findTop25ByArcustnoLessThanOrderByArcustnoDesc(String arcustno);

それはJPAを使用し、おそらくすべてのデータベースで動作し、SPRING JPA 1.7.0(Evansリリーストレイン)から動作します

JpaRepository ではなく CrudRepository を実装します

于 2016-10-06T20:44:19.713 に答える
11

Rakeshの答えが正しいかどうかはわかりません。彼はJPAクエリ構文ではなく、SQLを書いているようです。
JPA @Query で LIMIT を使用しようとしたところ、「制限」が認識されないという例外が発生しました。

@Query("select d from Device d where d.deviceName like CONCAT('%', :deviceName, '%') and d.deviceId not in :notList ORDER BY deviceName DESC Limit 1001")

Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: Limit near line 1, column 162

また、JPA は「制限」をサポートしていないと言う Hari Shankar からのこの回答を参照してください: JPA は「制限」をサポートしていません

于 2015-02-13T21:58:27.460 に答える
1

これは 6 年前のリクエストであることはわかっていますが、これはまだ同様の問題を抱えている人にとっては役立つかもしれません。

ネイティブSQLでは、次のようなネイティブクエリを使用して結果セットを制限します

SELECT firstName, lastName,  FROM Student ORDER BY studentNumber LIMIT 1;

しかし、JPA はLIMIT キーワードを認識しません。代わりに setMaxResultsを使用します

エンティティ オブジェクトを既にセットアップしている場合は、JPA sql を使用して上位 25 に簡単にフィルターできます。構文は次のとおりです。

entitymanager.createquery("select a from  "your Entity Object"  a where a.id =: parameter order by a.Id).setParameter("id",paramvalue).setMaxResults(25).getResultList();

あなたの場合、これはうまくいくはずです

entitymanager.createquery("SELECT a FROM Arcust a WHERE a.arcustno <= :'parameter' ORDER BY a.arcustno DESC).setparameter("arcustno",1).setMaxResults(25).getResultList();
于 2020-03-04T20:17:24.880 に答える