Hibernate: Mapping custom column names in stored procedure named query

11,198

Solution 1

You'll need to implement your own ResultTransformer. It's really simple, and you can look at the source of the bundled implementations for inspiration.

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

Solution 2

Based on @partenon's answer on using a custom ResultTransformer, here's the final solution:-

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();
Share:
11,198
limc
Author by

limc

Uhm... yea... My Shitty Code Blog My GitHub Page

Updated on June 27, 2022

Comments

  • limc
    limc almost 2 years

    I currently have the following named query that wraps around 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 columns name_first and name_last are the exact column names returned by the stored procedure. I created a bean that contains the same column names so that I can map the queried result into that bean.

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

    The Hibernate code that calls the named query and map the result into the bean:-

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

    All of these 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 map my column names against the stored procedure's columns in my named query above?

    Thanks.

    UPDATE - I added my final solution below.

  • limc
    limc over 13 years
    Thanks, I added my final solution in the Answers section.
  • May12
    May12 over 8 years
    limc, do you have exception like: Exception in thread "main" java.lang.NullPointerException at org.hibernate.loader.Loader.processResultSet(Loader.java:950‌​) at org.hibernate.loader.Loader.doQuery(Loader.java:921) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyColle‌​ctions(Loader.java:3‌​55) at org.hibernate.loader.Loader.doList(Loader.java:2554) at org.hibernate.loader.Loader.doList(Loader.java:2540) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java‌​:2370)?