Как использовать запрос хранимой процедуры hibernate с преобразователем набора результатов - PullRequest
0 голосов
/ 26 октября 2019

Это то, как я вызываю хранимую процедуру sql server

public Response<List<CollectionItem>> getCollectionList(int customerId) {
        StoredProcedureQuery query = entityManager.createStoredProcedureQuery("Sp_Tab_GetCollectionInvoice");
        query.registerStoredProcedureParameter("CustomeriD", int.class, ParameterMode.IN);
        query.registerStoredProcedureParameter("Ccode", int.class, ParameterMode.IN);


        query.setParameter("CustomeriD", customerId);
        query.setParameter("Ccode", 1);

        List<CollectionItem> resultList = query.unwrap(Query.class)
                .setResultTransformer(Transformers.aliasToBean(CollectionItem.class)).getResultList();

        return new ResponseUtil().createResponse(resultList);

    }

Это класс pojo

public class CollectionItem {

    public long ID;
    public String TransType;
    public long Invno;
    public String TDate;
    public double Amount;


    public CollectionItem(long ID, String TransType, long Invno, String TDate, double Amount) {
        this.ID = ID;
        this.TransType = TransType;
        this.Invno = Invno;
        this.TDate = TDate;
        this.Amount = Amount;
    }
}

Но это не преобразует результат, а выдает списокмассива объектов

Как правильно сопоставить массив объектов с классом pojo?

Должен ли я вручную преобразовывать массив объектов в pojo, запустив цикл?

1 Ответ

0 голосов
/ 27 октября 2019

Я не эксперт по этому вопросу, но у EntityManager.createStoredProdecureQuery есть второй аргумент, используемый для указания типа возвращаемого значения. Что происходит, когда вы меняете вызов следующим образом (также прокомментируйте строку, которую вы установили ResultTransformer)?

StoredProcedureQuery query = entityManager.createStoredProcedureQuery("Sp_Tab_GetCollectionInvoice", CollectionItem.class);

Если вышеуказанное решение не работает, я подозреваю, что столбцы, возвращенные из хранимой процедуры, несопоставьте членов класса POJO, как требуется. Вы можете написать отображение, используя <sql-result-set-mapping> или соответствующую аннотацию, чтобы отобразить ваш набор результатов для ваших учеников. Насколько я помню, интерфейс запросов Hibernate также имеет методы для обработки этого отображения программно. Возможно, вы захотите проверить методы addRoot() и addProperty().

Примечание: Я только что заметил, что ваш класс CollectionItem не помечен @Entity. Я не уверен, что вышеуказанное решение будет работать в этом случае. Если вы не хотите добавлять @Entity и использовать преобразователь результатов, я думаю, что вашему классу CollectionItem нужен конструктор без аргументов. Чтобы преобразователь bean работал, Hibernate требует, чтобы у класса не было конструктора или общедоступного конструктора без аргументов.

...