Hibernate - createNativeQuery带有“非实体类”结果

时间:2013-09-27 12:42:04

标签: java hibernate jpa

我对所有这些Hibernate / JPA内容都很陌生,所以我会尽量保持清晰。

在Hibernate中有没有办法使用createNativeQuery在查询中选择单个/或多个字段而不使用Entity类作为返回对象?

我试图在不使用任何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): 我开始认为它不是Hibernate中的一个错误,也不可能做这样的事情......

6 个答案:

答案 0 :(得分:11)

问题是您将String.class作为第二个参数传递给createNativeQuery。这将使hibernate尝试使用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);

答案 1 :(得分:6)

如果是Native查询或带有列名的jpql,则EntityManager返回一个对象数组的列表。

以获得结果列表。

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

然后迭代它: -

for (Object[] record : listResults) {

            //Iterate Logic will come here

                    }

答案 2 :(得分:4)

尝试在不传递createNativeQuery()的情况下致电String.class。如果name列在数据库query.getSingleResult()中属于字符串类型,则实际上会返回String

答案 3 :(得分: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

答案 4 :(得分: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);

答案 5 :(得分:0)

对于Hibernate 5.0

Query query = getEntityManager().createNativeQuery(sql);
List<Object[]> objects = query.getResultList();
System.out.println(objects.get(0)[0]);

https://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/chapters/query/native/Native.html