代码之家  ›  专栏  ›  技术社区  ›  mgamer

jpql在select语句中创建新对象-回避还是拥抱?

  •  56
  • mgamer  · 技术社区  · 14 年前

    我最近了解到在 JPQL 声明如下:

    select new Family(mother, mate, offspr)
    from DomesticCat as mother
        join mother.mate as mate
        left join mother.kittens as offspr
    

    这是应该避免的还是应该拥抱的?何时根据良好实践证明使用此功能是合理的?

    3 回复  |  直到 7 年前
        1
  •  105
  •   naXa stands with Ukraine    9 年前

    别逃避 ,之所以会出现select new,是因为在 第十版2.2.7.2页。select子句中的jpql构造函数表达式 EJB 3.0 JPA Specification :

    构造函数可用于 选择列表返回一个或多个Java 实例。指定的类不是 必须是一个实体或 映射到数据库。 这个 构造函数名称必须是完整的 有资格的。

    如果指定了实体类名 在select new子句中, 结果实体实例位于 新状态。

    SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count)
    FROM Customer c JOIN c.orders o
    WHERE o.count > 100
    

    简而言之,如果不想以类型安全的方式检索完整的实体或完整的对象图(与 Object[] )在实体类中映射查询结果还是在非映射类中映射查询结果将取决于您的选择。一个典型的例子是列表屏幕(您可能不需要所有的细节)。

    换言之,不要在任何地方使用它,但不要禁止它的使用(很少东西只有黑色或白色)。

        2
  •  26
  •   Hendy Irawan    10 年前

    当您想要检索 数据传输对象 . 也许一份报告是一个很好的使用它的地方。如果您只想检索一个域对象(比如 来自家庭 相反),因此没有理由使用它。

        3
  •  6
  •   gmournos    9 年前

    用new创建的对象不必是dto,即将由业务层导出的对象。它也可以是pojo域对象,即业务层内部使用的对象。

    使用这种pojo作为部分对象而不是完整的jpa实体的原因是在特定类型的连接中的性能。一个很好的解释是: http://use-the-index-luke.com/sql/join/hash-join-partial-objects