Wie kann ich in einer Auswahlabfrage der JPQL-Abfrage eingrenzen? Ich brauche das Limit in der Abfrageebene selbst und nicht in der Java-Schicht
@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")
aber vergeblich!!!
Bitte vorschlagen
JPQL
bietet keinen Mechanismus zum Begrenzen von Abfragen. Dies wird meistens mit der setMaxResults()
-Methode für die Query
erreicht. Wenn Sie dies nicht in Java-Code angeben müssen, können Sie in der Datenbank eine Ansicht erstellen, die Ihre Abfrage enthält und die Begrenzung durchführt. Ordnen Sie dann dieser Ansicht eine Entität zu, wie Sie es von einer Tabelle gewohnt wären.
Beispiel:
List<String> resultList= query.setMaxResults(100).getResultList();
Wenn Sie mit spring-data arbeiten, sollten Sie das Pageable Interface verwenden. Ein Beispielcode unten,
Mein Service,
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));
}
}
Mein Repository,
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);
}
Eine ausführlichere Antwort zu den verfügbaren Federdaten finden Sie hier .
Für bestimmte @NamedQueries, für die ein Limit erforderlich ist, können Sie zu @NamedNativeQuery wechseln
@NamedNativeQuery(
name=UserNotification.QueryName.NOTIFICATION_DISPLAYED_LIMIT5,
query="SELECT un.* FROM user_notification un " +
"WHERE un.user.id = ?1 LIMIT 5",
resultClass=UserNotification.class
)
Nicht ganz so glatt, aber erledigt den Job.
beim Ausführen der Abfrage mit dem Entity Manager schreiben Sie einfach .setMaxResults (kein Obj)