Hibernate: отображение имен пользовательских столбцов в хранимой процедуре с именем query - PullRequest
3 голосов
/ 01 февраля 2011

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

<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 - это точные имена столбцов, возвращаемые хранимой процедурой.Я создал bean-компонент, содержащий те же имена столбцов, чтобы я мог отобразить запрашиваемый результат в этот bean-компонент.

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

    ...
}

Код Hibernate, который вызывает именованный запрос и отображает результат в bean-компонент: -

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  

    ...
}

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

Спасибо.

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

Ответы [ 4 ]

1 голос
/ 01 февраля 2011

Основываясь на ответе @ 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();
1 голос
/ 01 февраля 2011

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

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

0 голосов
/ 01 февраля 2011

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

0 голосов
/ 01 февраля 2011

Просто создайте свой боб вручную:

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

У этого есть одно дополнительное преимущество: он позволяет сделать ваш MyBean неизменным.

...