【问题标题】:Hibernate JPA Transient TableHibernate JPA 瞬态表
【发布时间】:2018-06-22 02:55:38
【问题描述】:

是否可以使用 Hibernate JPA 从多个实体返回一个结果集(RS),但返回的 RS 本身不是持久性实体?

例如(伪代码):

持久性实体一个具有字段ABOneflag

持久性实体两个具有字段CDTwoflag

持久性实体三个具有字段EFThreeflag

我正在寻找类似的东西

@Query(value ="Select A, C, E from One o, Two tw, Three th 
where o.oneFlag = tw.TwoFlag and
o.oneFlag = th.ThreeFlag", ***nativeQuery*** = true)

List<MyRsClass> findByFlag(@Param(aFlag) String aFlag);

我的非持久类是:

Class MyRsClass {
  String A;
  String C;
  String E
  .....
}

如果我在数据库中创建MyRsClass 和一个表,我当然可以做到这一点,但我试图避免这种情况。

任何建议都将不胜感激。

【问题讨论】:

    标签: java hibernate jpa spring-data-jpa


    【解决方案1】:

    是的,结果类是 JPA 标准,在您的情况下,您将更改查询:

    @Query(value ="Select new com.mypackage.MyRsClass(A, C, E) from One o, Two tw, Three th 
    where o.oneFlag = tw.TwoFlag and
    o.oneFlag = th.ThreeFlag",
    

    记住:

    • 使用适当的参数顺序指定构造函数
    • 在查询中使用完全限定的类名

    【讨论】:

    • 谢谢一百万。我没有意识到这一点。关于 MyRsClass 的构造函数,我有 public MyRsClass(Long A, String C, String E) { this.A = A ....} 但我得到错误 Parameter 0 of constructor in ...MyRsClass required a bean of type '长'找不到。知道如何解决吗?我确实将课程注释为@Componenet
    • 您必须确保构造函数具有参数类型,以便它们与 select 中的列类型匹配。显然您需要在第一个参数中期望 Long
    • 嗨......我不确定我是否理解这部分“你必须确保构造函数具有参数类型,以便它们与选择中的列类型匹配。”。我检查了,他们做到了。在我回顾的地方是否有一个完整的例子。一旦我添加了构造函数,错误就会显示在 IDE 中......但没有构造函数我无法继续。
    • 也许您应该将第一个参数更改为字符串
    • 由于这不是原生查询,请尝试添加别名 so .. o.A, o.B, tw.C
    猜你喜欢
    • 1970-01-01
    • 2016-01-28
    • 2017-10-15
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多