繁体   English   中英

可以使用JPA / Hibernate做到这一点

[英]can do this with JPA / Hibernate

我正在使用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)")对其进行注释@Formula("myFunction(field1, field2)") Hibernate会将其添加到所有具有实体的查询中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM