JPA ограничивает `queryResultList`, хотя` setMaxResults` не определено - PullRequest
0 голосов
/ 03 июля 2019

Я написал следующий фрагмент кода для извлечения записей определенных zip-файлов из таблицы zips, используя hibernate в качестве поставщика JPA.

    public List<ZipEntity> getZipEntityFromZipName(String zipName, String version, String createdBy,
                                                      String type) throws FileException {

        int numAttempts = 0;
        do {
            numAttempts++;
            EntityManager entityManager = getNewEntityManager();
            try {
                TypedQuery<ZipEntity> query = entityManager
                        .createNamedQuery(Constants.Database.Queries.GET_FROM_ZIP_NAME, ZipEntity.class)
                        .setParameter("zipName", zipName)
                        .setParameter("version", version)
                        .setParameter("createdBy", createdBy)
                        .setParameter("type", type);
                return query.getResultList();
            } catch (PersistenceException e) {
                validatePersistenceException(e);
            } finally {
                closeEntityManager(entityManager);
            }
        } while (numAttempts <= maxRetries);
        throw new FileException("Database connection failed.");

Вот соответствующие классы сущностей

@NamedNativeQueries({
        @NamedNativeQuery(
                name = Constants.Database.Queries.GET_FROM_ZIP_NAME,
                query = Constants.Database.Queries.GET_FROM_ZIP_NAME_QUERY,
                resultClass = ZipEntity.class
        )
})
@Entity
@Table(name = "zips")
public class ZipEntity {

    @EmbeddedId
    private ZipKey ZipKey;

    public ZipEntity() {

    }

    public ZipEntity(String zipName, String version, String createdBy, String file, String type,
                      String extension) {

        this.ZipKey = new ZipKey(zipName, version, createdBy, file, type, extension);
    }
}

@Embeddable
public class ZipKey implements Serializable {

    static final long serialVersionUID = 1L;

    @Column(name = "zip_name")
    private String zipName;

    @Column(name = "version")
    private String version;

    @Column(name = "created_by")
    private String createdBy;

    @Column(name = "filepath")
    private String file;

    @Column(name = "type")
    private String type;

    @Column(name = "extension")
    private String extension;

 // Getter, setters and Constructor
}

И запрос в классе Constant выглядит следующим образом:

public static final String GET_FROM_ZIP_NAME = "getFile";
public static final String GET_FROM_ZIP_NAME_QUERY = "SELECT * FROM zips WHERE zip_name = " +
                    ":zipName AND version = :version AND created_by = :createdBy AND type = :type";

Событие, хотя setMaxResults() не определено для вышеуказанного запроса, результаты, полученные из приведенного выше фрагмента кода, ограничены25 записей, хотя тот же запрос, выполненный в БД, приводит к 35 записям.Что я здесь не так делаю?

1 Ответ

1 голос
/ 03 июля 2019

Пожалуйста, отладьте ваше решение и проверьте значения параметров "zipName", "version", "creationBy", а также "type", чтобы убедиться, что они являются ожидаемыми вами значениями. Этот запрос содержит условия, объединенные логикой AND, которая влияет на ваши результаты. Чтобы получить 35 записей, ваши параметры должны соответствовать вашим условиям для всех 35 записей.

Вы можете ограничить записи, как показано ниже в NamedNativeQuery, который предоставляет вам 35 записей одновременно.

 @NamedNativeQuery(
                name = Constants.Database.Queries.GET_FROM_ZIP_NAME,
                query = Constants.Database.Queries.GET_FROM_ZIP_NAME_QUERY,
                fetchSize = 35,
                resultClass = ZipEntity.class
        )
...