Hibernate: matching user column names in stored procedure with query name

I currently have the following named request that wraps a stored procedure: -

<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>

The name_firstand columns name_lastare the exact column names returned by the stored procedure. I created a bean that contains the same column names as I can match the result with this bean.

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

    ...
}

Hibernate code that calls a named query and displays the result in a bean: -

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

They all work fine, but instead of relying on the column names from the stored procedure, I want to use my own column names in MyBean, for example: -

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

    ...
}

How do I match column names with columns of a stored procedure in my named query above?

Thank.

UPDATE. .

+3
4

@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

Just create your bean manually:

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

This has one additional benefit: it allows you to make your MyBean immutable.

0
source

You can use the solution described in this blog post . It works great and can be reused.

0
source

Source: https://habr.com/ru/post/1789248/


All Articles