JPA原生查询获取单个对象

5

如何使用JPA原生查询获取单个对象。我做了一些研究,但所有的回答都是使用"getSingleResult",然而它并没有返回我想要的结果。例如,如果我想得到我的数据库中表的计数,并将其获取为一个整数,该怎么办。

下面的代码展示了我如何使用Hibernate Sessison获取这个值:

int check = Integer.parseInt((String) sessionF.createSQLQuery("select to_char(count(*)) as count from user_tables where table_name upper('TEST')").uniqueResult()); 

我希望在JPA中实现的目标:

int check = Integer.parseInt((String) getEntityManager().createNativeQuery("select to_char(count(*)) as count from user_tables where table_name upper('TEST')").getSingleResult()); 

显然,这段代码没有返回我想要的结果。因此,请帮助我解决这个问题。谢谢!


似乎可以使用JPQL查询的内容... - Neil Stockton
3个回答

5
使用JPA时,您需要按照以下方式进行操作:
int num = ((Number)this.entityManager.createNativeQuery("select count(*) from your_table_name")
                .getSingleResult()).intValue();

edited :

 String name = this.entityManager.createNativeQuery("select t.name from your_table_name t limit 1").getSingleResult().toString();

你将会得到一个数值计数器,使用num对象。

希望这能对你有所帮助。


你好,感谢您的回复。这返回了正确的结果。但是我希望能够获取从数据库查询的对象的值。如果我想要获取像“select name from table_test where id = 1”这样的对象,我该怎么做? - minh
String name = this.entityManager.createNativeQuery("select t.name from your_table_name t limit 1").getSingleResult().toString();将上述代码翻译成中文: - Ravi Kavaiya
嗨,Ravi,抱歉回复晚了。它运行得很好,非常感谢你。 - minh

3

如果本地查询具有多个选择表达式,则返回一个 Object[](或 List<Object[]>)。

您可以根据需要使用以下示例代码。

Query q = em.createNativeQuery("SELECT id,name FROM user WHERE id = ?1");
q.setParameter(1, userId);
Object[] result = (Object[])q.getSingleResult();
String id= result[0];
int name = result[1];

你可能需要对结果 Array 的值进行类型转换。

如果查询 JPA 没有结果,则抛出 NoResultException。 - Heril Muratovic

2
这可能会对某些人有所帮助。 要获取单个对象,您可以选择以下任一方法:
方法1:
Query theQuery = entityManager.createNativeQuery("SELECT * from yourTable where yourTableId = (Select MAX(yourTableId) from yourTable where empId = ?1 and instId = ?2 GROUP BY empId,instId)",YourTableEntity.class);
theQuery.setParameter(1, empId);
theQuery.setParameter(2, instId);
System.out.println(theQuery.getSingleResult()); 

方法二:

Query theQuery = entityManager.createNativeQuery("SELECT * from yourTable where empId = ?1 and instId = ?2 order by yourTableId DESC");   
theQuery.setParameter(1, empId);
theQuery.setParameter(2, instId);
theQuery.setMaxResults(1); //Use if it makes good impact in complexity
System.out.println(theQuery.getResultList().get(0));

注意:为了简单起见,我只是打印了它。您可能需要进行类型转换。 检查方法1或方法2所花费的时间哪个更适合您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接