2013-09-27 68 views
4

我是新来的所有这个Hibernate/JPA的东西,所以我会尽量做到尽可能清晰。休眠 - createNativeQuery与“非实体类”结果

Hibernate中有没有什么方法可以使用createNativeQuery在查询中选择一个或多个字段,而无需使用实体类作为返回对象?

我试图做到这一点,而不使用任何XML相关的东西。

Query query = getEntityManager().createNativeQuery("select name from contact where id_contact = :idContact", String.class); 
query.setParameter("idContact", 9293L); 
Object string = query.getSingleResult(); 
System.out.println(string); 

使用这个我有例外:Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.MappingException: Unknown entity: java.lang.String

感谢

编辑:

我也试过:

Query query = getEntityManager().createNativeQuery("select name from contact where id_contact = :idContact"); 
query.setParameter("idContact", 9293L); 
List list = query.getResultList(); 
if (!list.isEmpty()){ 
    Object string = list.get(0); 
    System.out.println(string); 
} 

以同样的异常:Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to [Ljava.lang.Object;

编辑(2): 我开始认为这是无论是在休眠错误或这是不可能做这样的事情......

回答

1

只是尝试调用createNativeQuery()没有通过String.class。如果name列在数据库query.getSingleResult()中是字符串类型,实际上将返回String

8

问题是您正在将String.class作为第二个参数传递给createNativeQuery。这将使休眠尝试使用String.class为结果集创建映射。它只能从实体类创建映射,而String不是实体类,因为它没有映射到表。

幸运的是,解决方案是简单地使用不需要第二个参数的重载版本createNativeQuery

String SQL = ".."; //same SQL as you had before 
Query query = getEntityManager().createNativeQuery(SQL); //no entity mapping 
query.setParameter("idContact", 9293L); 
Object string = query.getSingleResult(); 
System.out.println(string); 
0

尝试

Query query = getEntityManager().createNativeQuery("select name from contact where id_contact = :idContact", String.class); 
query.setParameter("idContact", 9293L); 
List list = query.getResultList(); 
if (!list.isEmpty()){ 
    Object string = list.get(0); 
    System.out.println(string); 
} 

在查找这里

http://sysout.be/2011/03/09/why-you-should-never-use-getsingleresult-in-jpa

+0

相同抛出异常:异常在线程 “主要” java.lang.ClassCastException:java.lang中。字符串不能转换为[Ljava.lang.Object; – Joshua

5

在本地查询或与JPQL列名的EntityManager的情况下返回对象的数组列表。

所以得到结果列表。

收到的

List<Object[]> listResults = query.getResultList(); 

然后迭代它: -

for (Object[] record : listResults) { 

      //Iterate Logic will come here 

        } 
+0

同样的例外:线程“main”中的异常java.lang.ClassCastException:java.lang.String不能转换为[Ljava.lang.Object; – Joshua

+0

我已经更新了我的回复,请现在检查。 – AjGupta

+0

listResults是Object []的列表,因此您需要迭代Object []以获取数据 – Bob

0
String SQL = ".."; //same SQL as you had before 
Query query = getEntityManager().createNativeQuery(SQL); //no entity mapping 
query.setParameter("idContact", 9293L); 
String string = (String)query.getSingleResult(); 
System.out.println(string); 
+1

虽然此代码可能回答此问题,但提供有关如何解决问题和/或解决问题原因的其他上下文会改善答案的长期价值。 – wasthishelpful