0

我正在使用 postgres 并将 JPA 与 Hibernate 一起使用,在 postgres 和其他 DBMS 中可以做到这一点:

SELECT *, function(parameter) AS xyz FROM table WHERE condition

我的问题是这样的,查询可以显示一个额外的字段(xyz),虽然没有这样的列。我可以用 Hibernate JPA 做到这一点。

4

3 回答 3

1

如果您没有映射实体,则需要使用本机查询:

Query query = entityManager
      .createQuery(
            "SELECT t.*, myfunction(:parameter) FROM table t WHERE t.attr = condition");
query.setParameter("parameter", value);
List resultList = query.getResultList();

否则,如果您有一个映射实体,您可以使用类型化查询或条件 API 来执行此操作。

使用类型化查询:

TypedQuery<Object[]> query = entityManager
      .createQuery(
            "SELECT t.*, FUNC('MyFunction', :parameter) FROM table t WHERE t.attr = condition",
            Object[].class);
query.setParameter("parameter", value);
List<Object[]> resultList = query.getResultList();

使用标准 API:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> query = criteriaBuilder.createTupleQuery();
Root<Table> root = query.from(Table.class);
Expression<Long> funcExpr = criteriaBuilder.function("myfunction",
      Long.class, root.get("parameter"));
query.multiselect(query.select(root), funcExpr);
List<Tuple> resultList = entityManager.createQuery(query)
      .getResultList();
于 2012-04-14T05:54:13.720 回答
0

通过使用 org.hibernate.SQLQuery,您可以使用 Hibernate 创建本机 SQL 查询。然后,您以与普通 Hibernate 查询相同的方式执行这些查询。显然,您将失去让 Hibernate 和 JPA 管理您的查询的许多好处,但如果它们不支持您想要的功能,它可能是唯一的方法。

于 2012-04-14T02:34:04.097 回答
0

另一种解决方案是使用公式,如果您在表的某些字段上调用函数,并且您总是想要函数的结果,您可以映射实体中的另一个属性并使用@Formula("myFunction(field1, field2)"). Hibernate 会将它添加到所有具有您的实体的查询中。

于 2012-04-14T06:07:58.713 回答