【问题标题】:Fetch content by HQL query通过 HQL 查询获取内容
【发布时间】:2016-02-29 13:14:21
【问题描述】:

所以这里是原生查询:

select p.my_t_id from  tl t
inner join p p 
on p.id=t.p
where t.id=1

实体结构

@Entity
class Tl{
 private Long p;
}


@Entity
class P{
      Long id;
      MyObjClass obj;
}

@Entity
class MyObjClass{
  Long myTId;
}

我无法弄清楚它的JPA 查询..

【问题讨论】:

  • 首先在实体之间建立适当的关系。如果您不明白为什么需要这样做,那么我认为 JPA 可能不适合您(目前)。看看那些基于 SQL 的框架,比如 MyBatis 或使用 Spring 的 JdbcTemplate
  • 无论如何,您的实体与您的数据模型不匹配。在P 表中有一个ID 列时,拥有MyObjClass 有什么意义
  • @AdrianShum 已编辑..
  • 我看不到任何有意义的变化

标签: java jpa


【解决方案1】:

正如我在评论中提到的,你必须有有意义的实体模型和关系。

类似这样的东西(我厌倦了无意义的名字,你能给点更有意义的吗?)

class Tl {
    private Long id;  // ID of Tl itself
    private P p;
}

class P {
    private Long id;
    private MyObjClass objClass;
}

class MyObjClass {
    private id;  // map to column myTId
}

HQL 看起来像

select tl.p.objClass.id from Tl tl

【讨论】:

    【解决方案2】:

    由于 Tl 和 P 没有关系,因此您必须使用笛卡尔连接。请参阅 JPA 规范中的第 4.4.5 节:http://download.oracle.com/otn-pub/jcp/persistence-2.0-fr-eval-oth-JSpec/persistence-2_0-final-spec.pdf

    不过,我无法真正为您翻译本机查询,因为您在 SQL 中引用了 Tl 和 P 上的 id 列,而这些列不在您的实体中。但是请阅读规范,这应该可以让您到达您想去的地方。

    【讨论】:

    • 答案是使用笛卡尔连接。我不能真正用他的实体展示 JPAQL,因为他的 SQL 和实体定义在一起没有意义(SQL 引用了不在实体定义中的列。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    相关资源
    最近更新 更多