Hibernate: отображение пользовательских имен столбцов в хранимой процедуре с именем запроса
-
27-10-2019 - |
Вопрос
В настоящее время у меня есть следующий назван запрос, который оборачивается вокруг хранимой процедуры:-
<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
Другие советы
На основе ответа @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 неизбежным.
Вы можете использовать решение, описанное в этом Сообщение блогаАнкет Он прекрасно работает и может быть использован повторно.