Hibernate - createNativeQuery带有"非实体类"结果

Jos*_*hua 5 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);
Run Code Online (Sandbox Code Playgroud)

使用这个我有例外: 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);
}
Run Code Online (Sandbox Code Playgroud)

具有相同的例外: Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to [Ljava.lang.Object;

编辑(2):我开始认为它是Hibernate中的一个错误,或者不可能做这样的事情......

cyo*_*yon 13

问题是你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);
Run Code Online (Sandbox Code Playgroud)


AjG*_*pta 6

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

所以要获得结果列表.

收到它

 List<Object[]> listResults = query.getResultList();
Run Code Online (Sandbox Code Playgroud)

然后迭代它: -

for (Object[] record : listResults) {

            //Iterate Logic will come here

                    }
Run Code Online (Sandbox Code Playgroud)


Ada*_*yga 4

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