Hibernate: отображение пользовательских имен столбцов в хранимой процедуре с именем запроса

StackOverflow https://stackoverflow.com/questions/4863883

Вопрос

В настоящее время у меня есть следующий назван запрос, который оборачивается вокруг хранимой процедуры:-

<hibernate-mapping>
    <sql-query name="mySp">
        <return-scalar column="name_first" type="string" />
        <return-scalar column="name_last" type="string" />

        { call some_sp :param }
    </sql-query>
</hibernate-mapping>

Столбцы name_first а также name_last Точные имена столбцов возвращаются хранимой процедурой. Я создал фасоль, который содержит одинаковые имена столбцов, чтобы я мог составить карту запрашиваемый результат в этот фасоль.

public class MyBean {
    private String  name_first;
    private String  name_last;  

    ...
}

Код Wildernate, который вызывает названный запрос и составил результат в фасоль:-

MyBean myBean = (MyBean) sessionFactory.getCurrentSession()
                        .getNamedQuery("mySp")
                        .setParameter("param", param)
                        .setResultTransformer(Transformers.aliasToBean(MyBean.class))
                        .uniqueResult();

Все это работает нормально, но вместо того, чтобы полагаться на имена столбцов из хранимой процедуры, я хочу использовать свои собственные имена столбцов в MyBean, Например:-

public class MyBean {
    private String  firstName; // instead of name_first
    private String  lastName;  // instead of name_last  

    ...
}

Как отобразить названия моих столбцов с столбцами хранимой процедуры в моем названном запросе выше?

Спасибо.

ОБНОВИТЬ - Я добавил свое окончательное решение ниже.

Это было полезно?

Решение

Вам нужно будет реализовать свой собственный результат. Это действительно просто, и вы можете посмотреть на источник комплексных реализаций для вдохновения.

http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/transform/resulttransformer.html

https://github.com/hibernate/hibernate-core/tree/master/hibernate-core/src/main/java/org/hibernate/transform

Другие советы

На основе ответа @Partenon на использовании пользовательского ResultTransformer, вот окончательное решение:-

MyBean myBean = (MyBean) sessionFactory.getCurrentSession()
                    .getNamedQuery("mySp")
                    .setParameter("param", param)
                    .setResultTransformer(new BasicTransformerAdapter() {
                        private static final long   serialVersionUID    = 1L;

                        @Override
                        public Object transformTuple(Object[] tuple, String[] aliases) {
                            String firstName = (String) tuple[0];
                            String lastName = (String) tuple[1];

                            return new MyBean(firstName, lastName);
                        }
                    })
                    .uniqueResult();

Просто построите свой фасоль вручную:

Object[] columns = (Object[]) sessionFactory.getCurrentSession()
                        .getNamedQuery("mySp")
                        .setParameter("param", param)
                        .uniqueResult();
MyBean myBean = new MyBean((String) columns[0], (String) columns[1]);

Это имеет одно дополнительное преимущество: это позволяет вам сделать вашу Mybean неизбежным.

Вы можете использовать решение, описанное в этом Сообщение блогаАнкет Он прекрасно работает и может быть использован повторно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top