11

我对所有这些 Hibernate/JPA 东西都很陌生,所以我会尽量清楚。

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):我开始认为这要么是 Hibernate 中的错误,要么是不可能做这样的事情......

4

6 回答 6

18

问题是您将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);
于 2013-09-27T12:50:41.490 回答
6

如果是列名 EntityManager 的本机查询或 jpql,则返回对象数组的列表。

所以得到结果列表。

收到它

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

然后迭代它:-

for (Object[] record : listResults) {

            //Iterate Logic will come here

                    }
于 2013-09-28T17:29:23.873 回答
4

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

于 2013-09-27T12:50:34.390 回答
2
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);
于 2017-05-10T08:50:24.167 回答
1

对于休眠 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

于 2019-02-18T11:16:04.807 回答
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

于 2013-09-27T12:51:48.613 回答