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")
しかし無駄に!!!
提案してください
JPQL
は、クエリを制限するメカニズムを提供しません。これはほとんどの場合、Query
でsetMaxResults()
メソッドを使用することで実現されます。これをJavaコードで指定しないようにする必要がある場合は、クエリを含むデータベースにビューを作成し、制限を実行します。その後、テーブルのようにエンティティをこのビューにマップします。
例:
List<String> resultList= query.setMaxResults(100).getResultList();
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 。
制限が必要な特定の@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
)
それほどスムーズではありませんが、仕事はします。