当前位置: 首页 > 知识库问答 >
问题:

不使用Hibernate连接关系的左连接

糜博远
2023-03-14
public class A{
   id ,//pk
   name,
   age
   //getters and setters
}

另一个宽大处理--B:

public class B{
   id, //pk
   a_id, //pk id of A
   degree,
   institute
   //getters and setters
}

这里要注意,实体A和B之间没有隐式关系,B表中的a_id是手工处理的,因此--关系类似于一对多(A-->B),但不是jpa-hibernate关系。而且,我的FullDto有A的所有属性和B的列表:

public class FullDto{
      id ,//pk
      name,
      age,
     List<B> bList;

    public class FullDto(id, age, name, bList)
     {
        this.id.id;
        this.age=age;
        this.name=name;
        this.bList=bList;
     }
    //getters and setters

}

现在,我想从A的存储库接口中提取所有内容(A和B表一次完成),如下所示:

public interface ARepository extends JpaRepository<A, Long> {
@Query("select " +
            "new packageName.FullDto(a.id, a.name, a.age, b) " +
            "from" +
            "   A a " +
            " left join B  b "+
            " on a.id=b.a_id "+
            "where " +
            "   a.id=:id ")
      FullDto getFullDetails(@Param("id") Long id);
}

共有1个答案

马宜民
2023-03-14

这是不可能的,因为构造函数语法只允许传递单个属性,即在这一级别上没有聚合记录,所以您必须创建某种中间件,并通过一些自定义代码将其聚合成fulldto,如Vlad Mihalcea在这里的解释:https://vladmihalcea.com/one-to-many-dto-projection-hibernate/

我认为对于Blaze-Persistence实体视图来说,这是一个完美的用例,因为它采用了更有效的方法,更易于使用和维护。

我创建了这个库,以便在JPA模型和自定义接口或抽象类定义的模型之间进行简单的映射,就像Spring Data Projects on Steroids一样。其思想是以您喜欢的方式定义目标结构(域模型),并通过JPQL表达式将属性(getter)映射到实体模型。

使用Blaze-Persistence实体视图,用例的DTO模型可以如下所示:

@EntityView(A.class)
public interface FullDto {
    @IdMapping
    Long getId();
    String getName();
    Long getAge();
    @Mapping("B[aId = VIEW(id)]")
    Set<BDto> getBList();

    @EntityView(B.class)
    interface BDto {
        @IdMapping
        Long getId();
        String getName();
    }
}

查询是将实体视图应用于查询的问题,最简单的只是按ID查询。

Page<FullDto> findAll(Pageable pageable);
 类似资料:
  • 问题内容: 需要使用意大利语翻译查找所有单词,如果不存在意大利语,则需要使用西班牙语(默认语言)。 我不能使用多个查询,并且存在条件(技术限制) 字 笔译 结果: 这段代码返回了我需要的全部信息,但是我无法在我所处的情况下使用存在条件的地方 问题答案: 我会在桌子上加入桌子两次,每种语言一次:

  • 带hibernate的JSF应用程序 有没有一种方法可以使用联接来过滤条件列表返回的结果<我有两张桌子。订单和顾客。 我需要返回丢失电子邮件地址的客户的所有订单,以及所有order.billingCustomeId=null和CustomeId=nullorder.shipping订单。 客户可以在或上进行匹配。 我将使用的SQL Hibernate标准 这将返回billing/shipping

  • 当我添加一个左连接来获取外部表的计数时,它将我其他左连接表的总和值与计数相乘,我也不能在这里使用不同的总和,因为两个值可以是相同的:

  • 我是新加入Hibernate的,所以请原谅我的陈词滥调,但我找不到任何与我的问题相关的答案(我试图搜索文档) 如果可能的话,我将从两个表(和)创建一个左外部联接,而不使用HQL;在我的例子中,我只想使用Criteria API。 我不知道哪些字段将用于连接,用户可以决定。 我看到Criteria API有一些不错的函数,比如或,但是如果我使用这些方法,我就无法运行连接。 每个表都有一个类(映射为特

  • 主要内容:Oracle LEFT JOIN子句简介,Oracle LEFT JOIN示例在本教程中,您将学习如何使用Oracle 子句来查询多个表中的数据。 Oracle LEFT JOIN子句简介 以下语句说明连接两个表和时的子句的语法: 在这个查询中,是左表,是右表。查询将表中的每一行与表中的行进行比较。如果和表中的一对行满足连接谓词,查询将组合两个表中行的列值,并将结果行记录包含在结果集中。 如果表中的行在表中没有找到匹配的行,则查询将会将SELECT子句中出现在表的每个列的值

  • LEFT OUTER JOIN 左外连接 [ ] 需求:查询所有分类,如果该分类下没有商品,则不显示该分类 [ ] 实现: SELECT `goods`.`id`, `goods`.`title`, `goods`.`price`, `goods`.`cate_id`, `cate`.`id`, `cate`, `cate.title` F