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

JPA N+1迭代

关飞翼
2023-03-14

我有两个实体,没有主键或外键引用,但我需要有一个单向实体使用或提取关系实体。使用Spring数据JPA。

以下是实体类:

@Entity
@Table(name="CAR_PARTS")
Class  CarParts {

@id
@Column(name="PART_ID")
private Long id;
@Column(name="PART_NAME")
private String partName

}

@Entity
@Table(name="CAR_HISTORY")
Class  CarHistory {

@id
@Column(name="CAR_HIST_ID")
private Long id;

@Column(name="PART_NAME")
private String part;

@ManyToOne(fetch=FetchType.lazy,optional=false)
    @JoinColumn(name="PART_NAME",referencedColumnName="PART_NAME",insertable=false,updatable=false)
    private CarPart carpart;
@column(name="SUBMIT_DATE")
private Date submitedDate;

    }

DAO类:

公共接口CarHistoryDAO扩展了JPararePository、JpaSpecificationExecutor{}

服务类别:

  public class CarhistoryServiceImpl {

  @Autowired
  private CarHistoryDAo carHistoryDAO;

  public List<CarHistory> findCarHistory(Date startDate, Date endDate) {
    List<CarHistory> hists = 
     carhistoryDAO.findAll(where(historyBySubmitedDate(startDate,endDate)));
   }
   public static Specification<CarHistory> historyBySubmitedDate(
            final Date startDate, final Date endDate) {
        return new Specification<CarHistory>() {
            @Override
            public Predicate toPredicate(Root<CarHistory> variableRoot,
                    CriteriaQuery<?> q, CriteriaBuilder cb) {

                Predicate p1 = cb.between(
                        variableRoot.<Date> get("submitedDate"),
                        DateUtils.truncate(startDate, Calendar.DAY_OF_MONTH),
                        DateUtils.ceiling(endDate, Calendar.DAY_OF_MONTH));

                return cb.and(p1);
            }
    };
}

我使用的是Spring data jpa,实现了Spring data jpa中的使用规范。有没有什么方法可以避免N+1迭代问题。我试过用一个而不是一个

共有1个答案

公英哲
2023-03-14

为了避免n+1问题,您必须获取CarPart实例以及CarHistory实体。有多种解决方案:

>

  • CarHistory.CarPart映射为Eager(不是好的解决方案

    编写自定义查询并急切地提取CarHistory.Carpart,例如from CarHistory.ch JOIN fetch ch.Carpart where...

    这篇文章解释了如何初始化惰性关联以及何时使用它们

  •  类似资料:
    • 你竟任着刚硬不悔改的心,为自己积蓄忿怒,以致神震怒,显他公义审判的日子来到。他必照各人的行为报应各人。凡恒心行善,寻求荣耀、尊贵和不能朽坏之福的,就以永生报应他们;惟有结党不顺从真理,反顺从不义的,就以忿怒、恼恨报应他们。(ROMANS 2:7-8) 迭代 Bill正在介绍他的项目,嘴里不断蹦出“loop、iterate、traversal、recursion”这些单词,夹杂在汉语汇总。旁边的小白

    • 什么叫做迭代? 比如在 Java 中,我们通过 List 集合的下标来遍历 List 集合中的元素,在 Python 中,给定一个 list 或 tuple,我们可以通过 for 循环来遍历这个 list 或 tuple ,这种遍历就是迭代。 可是,Python 的 for 循环抽象程度要高于 Java 的 for 循环的,为什么这么说呢?因为 Python 的 for 循环不仅可以用在 list

    • 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。 在Python中,迭代是通过for ... in来完成的,而很多语言比如C或者Java,迭代list是通过下标完成的,比如Java代码: for (i=0; i<list.length; i++) { n = list[i]; } 可以看出,Python的

    • 如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。 在Python中,迭代是通过for ... in来完成的,而很多语言比如C语言,迭代list是通过下标完成的,比如Java代码: for (i=0; i<list.length; i++) { n = list[i]; } 可以看出,Python的for循

    • null 一些示例输出数据: *编辑:工作的scala代码行:

    • 我想在列表中从0到结尾无限迭代,但在下一个循环中,我想从1开始到结尾加0,下一个循环将从2开始到结尾加0,1,直到最后一个项目,它将再次从0开始到结尾。 这是我的代码: 这就是我目前提出的解决方案。这远非完美。 我想要的结果是: 等等