У меня есть класс дескриптора для пары классов домена. Класс дескриптора имеет поле «тип», которое является перечислением и указывает тип класса домена. В некоторых запросах я хочу вернуть один или несколько дескрипторов и передать тип в качестве аргумента конструктора. Поэтому моя идея состояла в том, чтобы передать его в качестве параметра запроса:
String jpql = "SELECT NEW model.ModelDescriptor"
+ "(t.id, t.name, t.description, :modelType) ... ";
TypedQuery<ModelDescriptor> query = em.createQuery(jpql, ModelDescriptor.class);
query.setParameter("modelType", ModelType.forClass(clazz));
List<ModelDescriptor> list = query.getResultList();
Это не работает. Исключение не выдается, но в результатах указан тип null
. Также невозможно передать литерал enum в запрос:
"SELECT NEW model.ModelDescriptor (f.id, f.name, f.description,
model.ModelType.FLOW) ... "
редактировать
Я получаю следующую трассировку стека:
java.lang.IllegalArgumentException: An exception occurred while creating a query in
EntityManager:
Exception Description: Error compiling the query [SELECT model.ModelDescriptor(f.id,
f.name, f.description, model.ModelType.FLOW) FROM Flow f WHERE flow.id = :flowId],
line 1, column 78: unknown identification variable [model]. The FROM clause of the
query does not declare an identification variable [model].
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.
createQuery(EntityManagerImpl.java:1477)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.
createQuery(EntityManagerImpl.java:1497)
Я использую EclipseLink в качестве каркаса постоянства.
Есть ли способ передать литерал enum в выражение SELECT NEW?