问题
I have below SQL query
select column1 ,column2 ,column3 ,column4 ,column5 ,column6 from (
select ROW_NUMBER() OVER (PARTITION BY column2 ORDER BY null desc) rn,column1,
column2 ,column3 ,column4 ,column5 ,column6
from TBLCUSTOMERSUBMODULERELATION where column1 = 'somevalue' AND column3 ='somevalue')
where rn=1;
i want to convert this query to HQL.
In my code column1,column2,column3 is EmbeddedId
I have tried to convert or mapped directly this result in my class object using below code
session = sessionFactory.openSession();
SQLQuery sqlQuery = session.createSQLQuery(qry);
sqlQuery.addEntity(CustomerSubModuleRelationBean.class);
but it gives error like Caused by: java.sql.SQLException: Invalid column name
Is anyone have idea how to use convert this native SQL to HQL or map my result directly to entity class in Hibernate.
回答1:
You can try convert your sql query to hibernate query with adding some alias names to query statement
Check here : Query conversion - Sql to Hql
You are after a native SQL query.
If you are using JPA the syntax is:
Query q = em.createNativeQuery("select foo.* FROM Foo foo " +
"where f.x = max(f.x) over " +
"(partition by f.y)", Foo.class);
If you need to return multiple types, take a look at the SQLResultSetMapping annotation.
If you're using the the Hibernate API directly:
Query q = session.createSQLQuery("select {foo.*} from Foo foo " +
"where f.x = max(f.x) over "+
"(partition by f.y)");
q.addEntity("foo", Foo.class);
See 10.4.4. Queries in native SQL in the Hibernate documentation for more details.
In both APIs you can pass in parameters as normal using setParameter.
Use this way to initialize your sessionFactory instead of openSession method.
SessionFactory factory = new AnnotationConfiguration()
.configure()
//.addPackage("com.xyz") //add package if used.
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
I hope this helps you.
来源:https://stackoverflow.com/questions/36861306/convert-sql-query-to-hql-or-map-result-to-hibernate-entity