来自主键的 JPA 查询 class
JPA query class from primary key
如果我拥有实体的主键,我将如何仅查询实体的 class?我不想检索整个对象,当我只对该对象的 class 感兴趣时,这似乎是不必要的。我试过了
SELECT o.dtype FROM MyEntity o WHERE id = ?1
但这不起作用。
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;
}
这会给你实际的 class:
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();
如果我拥有实体的主键,我将如何仅查询实体的 class?我不想检索整个对象,当我只对该对象的 class 感兴趣时,这似乎是不必要的。我试过了
SELECT o.dtype FROM MyEntity o WHERE id = ?1
但这不起作用。
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;
}
这会给你实际的 class:
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();