【发布时间】:2015-12-04 10:54:40
【问题描述】:
如果我有一个实体的主键,我将如何只查询它的类?我不想检索整个对象,当我只对该对象的类感兴趣时,这似乎是不必要的。我试过了
SELECT o.dtype FROM MyEntity o WHERE id = ?1
但这不起作用。
【问题讨论】:
-
我有多个实体的子类持久化,它们的 ID 为 Long。我要查询 Long id 源类
标签: java jpa persistence
如果我有一个实体的主键,我将如何只查询它的类?我不想检索整个对象,当我只对该对象的类感兴趣时,这似乎是不必要的。我试过了
SELECT o.dtype FROM MyEntity o WHERE id = ?1
但这不起作用。
【问题讨论】:
标签: java jpa persistence
这将为您提供实际的课程:
SELECT TYPE(e) FROM MyEntity e WHERE e.id = ?1
Class<?> clazz = entityManager.createQuery(query, Class.class)
.setParameter(1, id)
.getSingleResult();
以下为您提供鉴别器值:
SELECT e.class FROM MyEntity e WHERE e.id = ?1
String discr = entityManager.createQuery(query, String.class)
.setParameter(1, id)
.getSingleResult();
【讨论】:
SELECT o.dtype FROM MyEntity o WHERE o.id = ?1
您将 MyEntity 的别名用作 o 使用 o 定义列 id。
【讨论】:
实际上这个查询有效:
SELECT o.class FROM MyEntity o WHERE id = ?1
示例用法:
public static Class<? extends MyEntity> getClassOf(Long id) {
TypedQuery<String> q = entityManager().createQuery(
"SELECT o.class FROM MyEntity o WHERE id = ?1",
String.class);
q.setParameter(1, id);
q.setMaxResults(1);
List<String> r = q.getResultList();
if (r.size() == 0)
return null;
for (Package p : Package.getPackages()){
if (p.getName().startsWith("mypackage.prefix")){
try {
return (Class<? extends MyEntity>) Class.forName(p.getName() + "." + r.get(0));
} catch (ClassNotFoundException e) {
continue;
}
}
}
return null;
}
【讨论】: