【问题标题】:Select non-entities with JPA?使用 JPA 选择非实体?
【发布时间】:2010-05-20 13:01:54
【问题描述】:

JPA 是否可以通过本机查询检索非实体类的实例?
我有一个包含两个实体的非实体类:

class Wrap{
  Entity1 ent1;
  Entity2 ent2
}
@Entity
class Entity1{
  ...
}
@Entity
class Entity2{
  ...
}

我怎么能做这样的事情?

Query q = entityManager.createNativeQuery("native select here");
List<Wrap> list = q.getResultList();

【问题讨论】:

    标签: java jpa


    【解决方案1】:

    JPA 是否可以通过本机查询检索非实体类的实例?

    没有。原生查询可以返回实体(如果您通过将 resultClassresultSetMapping 传递给 createNativeQuery 方法来告诉它们这样做;如果不这样做,您将获得原始数据)。

    在 JPQL 中,您可以使用非实体构造函数的构造函数表达式 (SELECT NEW...)。但是本机查询不支持此操作,您必须手动执行此操作。

    【讨论】:

    • 嗨@Pascal 我正在尝试将构造函数表达式与非实体构造函数一起使用。我的 SQL 看起来像这样:SELECT NEW com.company.ui.EntityIDKey(c.companyId, c.name) FROM Company c WHERE c.companyId is not null and c.name is not null and length(trim(c.name)) &gt; 0 order by c.name asc 和我的 JPA 代码:List&lt;EntityIDKey&gt; companies = getEntityManager().createQuery(sql).getResultList(); 但我最终收到了类型安全警告。我该如何避免这种情况?
    【解决方案2】:

    没有实体的 JPA 原生查询 - 尤其是复杂查询(递归、多连接等)?

    这对我有用,但它是特定于休眠的:

    import org.hibernate.transform.Transformers;
    
    Query query = entityManagerFactory.createEntityManager().createNativeQuery(SQL);
    // Transform the results to MAP <Key, Value>
    query.unwrap(org.hibernate.SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
    query.setParameter("myNamedParam", myParam);
    List<Map<String, Object>> list = query.getResultList();
    for (Map<String, Object> map : list) {
        System.out.println(map);
    }
    

    参见。 https://www.programmerall.com/article/89371766511/

    【讨论】:

      【解决方案3】:

      我想我找到了解决方案。 有一种方法可以在构造查询时使用 NEW 关键字。 我做了什么来解决这个问题:

          public List<ProductType> getProductByName(String productName) {
              String sqlQuery = "select DISTINCT **NEW** project1.ProductType(o.name, o.revision) from Lhproduct o where o.name = :prodname";
              Query qry = getEntityManager().**createQuery(sqlQuery);**
              qry.setParameter("prodname",productName);
              return qry.getResultList();
       }
      

      ProductType 是一个非实体对象,是一个实现 Serialabale 的简单普通对象。但是您需要定义适当的构造函数。

      编码愉快 :-)

      感谢和问候, 哈里

      【讨论】:

      • 但是 Redfield 要求在本地查询中使用运算符 NEW !不是 jpa 查询。因此可以将该查询用作 createNativeQuery
      • 谢谢,但这不是本机查询的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      相关资源
      最近更新 更多