【问题标题】:How to map return values of entityManager.nativeQuery to entity class?如何将 entityManager.nativeQuery 的返回值映射到实体类?
【发布时间】:2013-07-10 03:27:13
【问题描述】:

例如我有一个实体类ProfileProfilenameagelocation 等一些字段。

在我的 DAO 中,我进行如下查询

Query q = entityMgr.createNativeQuery("SELECT name, age FROM Profile", Profile.class);
List<Profile> list = new ArrayList<Profile>();
list = q.getResultList();

这可能吗?只返回 2 个字段并将其放入 Profile 实体中?

编辑: 我已经尝试过了,并产生了Invalid column 错误。

【问题讨论】:

  • 试试看会发生什么
  • 请参阅上方的编辑。
  • 我假设这是一个运行时错误,因为它不是 getResultList() 引发的错误之一。所以我假设错误在您的查询中。你能发布错误吗?

标签: spring oracle hibernate dao


【解决方案1】:

假设它确实给出了您提到的无效列错误,那么一种解决方法是创建空列并使用您的 SQL 中的实体字段名称对其进行命名:

Query q = entityMgr.createNativeQuery("SELECT name, age, '' as location FROM Profile", Profile.class);

【讨论】:

    【解决方案2】:

    此解决方案不使用本机查询,但我不明白您为什么要首先使用本机查询。

    您还可以使用 constructor expression 返回一个只填充了必填字段的类。

    您可以按以下方式实现此目的:

    List<Profile> profiles = entityMgr.createQuery(
    "SELECT NEW com.myproject.Profile(p.name, p.age) FROM Profile p",
    Profile.class).getResultList();
    

    显然,您的 Profile 类中需要一个匹配的构造函数。

    您不仅需要以这种方式构造实体,还可以构造任何类,只要您有匹配的构造函数并且该类是完全限定的。

    【讨论】:

    • 我在先生之前试过这个但是我遇到了一个问题,例如我有一个应该返回名称(字符串)和位置(字符串)的查询以及另一个返回名称(字符串)和电子邮件(另一个字符串)例如。如果我这样做,我只能有 1 个 Profile(string, string) 构造函数,先生有什么解决方法吗?
    • 正如我之前提到的,您不仅需要以这种方式创建实体,还可以为每个组合创建不同的类,然后在查询中构造该对象。例如NameAndAgeProfile(String name, String age) and NameAndEmailProfile(String name, String email)
    • 感谢 Trevor,虽然这个解决方案有点麻烦。我想要的是保留我的实体而不是额外的类。
    猜你喜欢
    • 2011-06-24
    • 2019-08-16
    • 2020-06-27
    • 1970-01-01
    • 2010-10-06
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多