我做一个自定义查询,用户输入两个id
platformsId=1
typesId=1
完成了大约18个查询 我的班级
@Entity
public class Head {
@Id
private Integer id;
@OneToMany(mappedBy = "head")
private List<PackageInstances> packageInstance;
@ManyToOne
private Platforms platform;
@ManyToOne
private Types type;
@ManyToOne
private Owners Owner;
@ManyToOne
private Pack package;
}
查询我在参数值
的功能中创建@Override
public Page<Head> advancedSearch(HeadSearch search, Pageable page) {
Specification<Head> specification = (Root<Head> root, CriteriaQuery<?> cq, CriteriaBuilder cb) -> {
Predicate p = cb.conjunction();
if (search.getId() != null) {
p.getExpressions().add(cb.equal(root.get("id"), search.getId()));
}
if (search.getOwnersId() != null) {
Join<Head, Owners> owners = root.join("Owner");
p.getExpressions().add(cb.equal(owners.get("id"), search.getOwnersId()));
}
if (search.getTypesId() != null) {
Join<Head, Types> types = (Join) root.fetch("type");
p.getExpressions().add(cb.equal(types.get("id"), search.getTypesId()));
}
if (search.getPlatformsId() != null) {
Join<Head, Platforms> platform = (Join) root.fetch("platform");
p.getExpressions().add(cb.equal(platform.get("id"), search.getPlatformsId()));
}
if (search.getPackagesId() != null) {
Join<Head, Pack> packages = root.join("package");
p.getExpressions().add(cb.equal(packages.get("id"), search.getPackagesId()));
}
return p;
};
return this.findAll(specification, page);
}
当然,分页会进行一些查询,但肯定不会导致所有查询完成。 抓取似乎没有改变任何东西。
我尝试添加JoinColumn,但遇到同样的问题。
有没有办法优化,以任何方式避免这么多查询?
答案 0 :(得分:1)
根据JPA 2.1 specification @ManyToOne
关系,FetchType.Eager
有一个默认的抓取策略,而您的实体类在该策略中有4种类型。
在构建条件时,您使用fetch
上的Types
和Platforms
(仅当有数据可以执行此操作时)和join
上的@ManyToOne
。因此,当使用请求检索实体时,hibernate将对每个未解析的Head
关系执行急切获取,这在您的情况下取决于用户的输入在每@ManyToOne(fetch = FetchType.LAZY)
2到4之间。
要减少数量或请求,您应该将FetchStrategy设置为关系上的延迟:
const os = require('os')
const username = // the code or the username so that it can be displayed
document.write("The username is: " + username)
或重构您的代码以强制使用初始查询获取所有内容。