我正在使用 postgres 并将 JPA 与 Hibernate 一起使用,在 postgres 和其他 DBMS 中可以做到这一点:
SELECT *, function(parameter) AS xyz FROM table WHERE condition
我的问题是这样的,查询可以显示一个额外的字段(xyz),虽然没有这样的列。我可以用 Hibernate JPA 做到这一点。
如果您没有映射实体,则需要使用本机查询:
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();
通过使用 org.hibernate.SQLQuery,您可以使用 Hibernate 创建本机 SQL 查询。然后,您以与普通 Hibernate 查询相同的方式执行这些查询。显然,您将失去让 Hibernate 和 JPA 管理您的查询的许多好处,但如果它们不支持您想要的功能,它可能是唯一的方法。
另一种解决方案是使用公式,如果您在表的某些字段上调用函数,并且您总是想要函数的结果,您可以映射实体中的另一个属性并使用@Formula("myFunction(field1, field2)")
. Hibernate 会将它添加到所有具有您的实体的查询中。