私はpostgresで作業しており、HibernateでJPAを使用しています.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();
別の解決策は、テーブルのいくつかのフィールドで関数を呼び出し、エンティティ内の別のプロパティをマップして注釈を付けることができる関数の結果が常に必要な場合は、式を使用することです@Formula("myFunction(field1, field2)")
。Hibernate は、エンティティを持つすべてのクエリにこれを追加します。
org.hibernate.SQLQuery を使用すると、Hibernate でネイティブ SQL クエリを作成できます。次に、これらのクエリを通常の Hibernate クエリと同じ方法で実行します。明らかに、Hibernate と JPA にクエリを管理させる利点の多くを失うことになりますが、それらが必要な機能をサポートしていない場合は、それが唯一の方法かもしれません。