Hibernate - createNativeQuery with "non-entity class"



我是所有这些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 中的错误,要么不可能做这样的事情......

问题是您将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);

如果是具有列名的本机查询或 jpql,则 实体管理器 返回对象数组的列表。

所以得到结果列表。

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

然后迭代它:-

for (Object[] record : listResults) {
            //Iterate Logic will come here
                    }

只需尝试在不传递String.class的情况下调用createNativeQuery()。如果数据库中的name列是字符串类型query.getSingleResult()实际上将返回一个String

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);

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

试试

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

相关内容

最新更新