jpa获取了很多查询

时间:2017-09-19 18:13:15

标签: hibernate jpa spring-data spring-data-jpa

我做一个自定义查询,用户输入两个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,但遇到同样的问题。

有没有办法优化,以任何方式避免这么多查询?

1 个答案:

答案 0 :(得分:1)

根据JPA 2.1 specification @ManyToOne关系,FetchType.Eager有一个默认的抓取策略,而您的实体类在该策略中有4种类型。

在构建条件时,您使用fetch上的TypesPlatforms(仅当有数据可以执行此操作时)和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)

或重构您的代码以强制使用初始查询获取所有内容。