In my application im using Hibernate 3.3 for the data connection. When im trying to get the resultset by a native query, it throws Cannot cast 'java.lang.Object[]' to org.model.Term
exception.
Model class :
@Entity @Table(name = "term") public class Term { @Id @GeneratedValue(strategy= GenerationType.AUTO) @Column(name = "version") private long versionId; @Column(name = "name") private String name; @Column(name = "created_date") private Date createdDate; }
Dao method :
@Repository @Transactional public class TermsDao { private static final String findLatestQuery = "select * from term WHERE version = (select max(version) from term)"; @PersistenceContext private EntityManager entityManager; @Transactional(readOnly = true) public Term findLatestTerm() { Query query = entityManager.createNativeQuery(findLatestQuery); return (Term) query.getSingleResult(); } }
persistence config :
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <class>org.model.Term</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/> <!--<property name="hibernate.hbm2ddl.auto" value="update"/>--> </properties> </persistence-unit>
table structure :
Field Type Key Extra version bigint(20) PRI auto_increment name varchar(255) created_date datetime
When query.getSingleResult();
is evaluated the results are there.
query.getSingleResult().getClass() returns `[Ljava.lang.Object;`
What might be causing this issue?
Advertisement
Answer
EntityManager.createNativeQuery(String sqlString) is meant for UPDATE and DELETE statements:
If the query is not an update or delete query, query execution will result in each row of the SQL result being returned as a result of type Object[] (or a result of type Object if there is only one column in the select list.)
Use createNativeQuery(String sqlString, Class resultClass) instead, i.e:
Query query = entityManager.createNativeQuery(findLatestQuery, Term.class);