web-dev-qa-db-ja.com

JPQL制限クエリ

JPQL名前付きクエリの選択クエリを制限するにはどうすればよいですか? Javaレイヤー!!!ではなく、クエリレベル自体で制限を行う必要があります!!!

@NamedQueries(value = {
        @NamedQuery(name = UserNotification.QueryName.NOTIFICATION_DISPLAYED,
                    query = "SELECT un FROM UserNotification un " +
                            "WHERE un.orgId IN (:orgList) " +
                            "AND un.user.id = :userId LIMIT 5")

しかし無駄に!!!

提案してください

32
user3115056

JPQLは、クエリを制限するメカニズムを提供しません。これはほとんどの場合、QuerysetMaxResults()メソッドを使用することで実現されます。これをJavaコードで指定しないようにする必要がある場合は、クエリを含むデータベースにビューを作成し、制限を実行します。その後、テーブルのようにエンティティをこのビューにマップします。

例:

List<String> resultList= query.setMaxResults(100).getResultList();
36
Kevin Bowersox

spring-data を使用している場合は、 Pageable Interface を使用する必要があります。以下のサンプルコード、

私のサービス、

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;

@Service
public class MyModelService {

    @Autowired
    private MyModelRepository myModelRepository;

    @Transactional
    public Page<MyModel> findMyModelTop5() {
        return myModelRepository.findMyModelTop5(new PageRequest(0, 5));
    }
}

私のリポジトリ、

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

@Repository
public interface MyModelRepository extends JpaRepository<MyModel, Integer> {

    @Query("SELECT mm FROM MyModel mm")
    public Page<MyModel> findMyModelTop5(Pageable pageable);

}

スプリングデータの利用可能なオプションについてのより完全な答えを見つけることができます here

29

制限が必要な特定の@NamedQueriesについては、@ NamedNativeQueryに切り替えることができます

@NamedNativeQuery(
  name=UserNotification.QueryName.NOTIFICATION_DISPLAYED_LIMIT5,
  query="SELECT un.* FROM user_notification un " + 
        "WHERE un.user.id = ?1 LIMIT 5",
  resultClass=UserNotification.class
)

それほどスムーズではありませんが、仕事はします。

7
muttonUp