【问题标题】:JPA query class from primary key来自主键的 JPA 查询类
【发布时间】:2015-12-04 10:54:40
【问题描述】:

如果我有一个实体的主键,我将如何只查询它的类?我不想检索整个对象,当我只对该对象的类感兴趣时,这似乎是不必要的。我试过了

SELECT o.dtype FROM MyEntity o WHERE id = ?1

但这不起作用。

【问题讨论】:

  • 我有多个实体的子类持久化,它们的 ID 为 Long。我要查询 Long id 源类

标签: java jpa persistence


【解决方案1】:

这将为您提供实际的课程:

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();

【讨论】:

    【解决方案2】:
    SELECT o.dtype FROM MyEntity o WHERE o.id = ?1
    

    您将 MyEntity 的别名用作 o 使用 o 定义列 id

    【讨论】:

    • 这有什么关系?我有多个 MyEntity 子类,需要知道它是哪个“子类”,而无需明确地将其添加到持久性中。
    • 请问您能清楚地解释您想要的问题吗?
    【解决方案3】:

    实际上这个查询有效:

    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;
    }
    

    【讨论】:

    • 这将返回鉴别器值,而不是实际的类。您需要一个与类名匹配的鉴别器值,但不一定总是如此。
    猜你喜欢
    • 1970-01-01
    • 2019-07-21
    • 2016-09-30
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多