web-dev-qa-db-de.com

JPQL-Limitabfrage

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 

29
user3115056

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();
32
Kevin Bowersox

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 .

23

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.

5
muttonUp

beim Ausführen der Abfrage mit dem Entity Manager schreiben Sie einfach .setMaxResults (kein Obj)

0
Udit Agarwal