首页 > 解决方案 > 如何优化 Hibernate 查询

问题描述

使用以下参数请求数据获取时:(DaoLayer)

  List<JobsEntity> list = session.createQuery("from JobsEntity where cleanerEntity.id =:id and "
                + "cleanerEntity.franchiseId=clientEntity.franchiseId and deleted=false order by date desc")
                .setParameter("id", id).setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE).list();

实体类 JobsEntity

@Getter
@Setter
@Entity
@Table(name = "jobs")
public class JobsEntity {
@Id
@GeneratedValue
@Column(nullable = false)
private int id;

@ManyToOne(targetEntity = ClientEntity.class, fetch = FetchType.EAGER)
@JoinColumn(name = "client_id")
private ClientEntity clientEntity;

@ManyToOne(targetEntity = CleanerEntity.class, fetch = FetchType.EAGER)
@JoinColumn(name = "cleaner_id")
private CleanerEntity cleanerEntity;

@Column(name = "allocation_date")
private Date date;
@Column(name = "end_date")
private Date endDate;

@Column(name = "optional_data")
private String optionalData;
@Column(name = "ntu")
private boolean ntu;
@Column(name = "deleted")
private boolean deleted;

我试图写一个本机查询

List<JobsEntity> list = session.createSQLQuery("Select * from jobs where cleaner_id =:id")
                .setParameter("id", id)
                .setResultTransformer(Transformers.aliasToBean(JobsEntity.class))
                .setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE).list();

然后创建流

也尝试使用 Creteria

 List<JobsEntity> list = criteria.add(Restrictions.eq("cleanerEntity.id", id))
                    .setResultTransformer(Transformers.aliasToBean(JobsEntity.class))
                    .setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE)
                    .list();

现在从 db 获取信息需要很长时间

-- 您是否尝试在 db Site 上为 WHERE 子句中的列使用索引?是——您是否启用了 sql 调试日志来打印所有生成的查询以供进一步分析?不——此外,我们讨论了多少条记录?每个20-30

标签: sqlperformancehibernate

解决方案


我的建议是:

  1. 将查询声明为带注释的名称查询,因为在启动时,在 CDI 扫描期间,hibernate 会构建元数据缓存和执行计划,从而使执行速度更快。
  2. 使用 FetchType.LAZY 生成单个 JOIN 本机查询。
  3. 在您的查询上设置QueryHints.HINT_READONLYtrue防止休眠实例化所有脏标志和状态跟踪基础设施。

推荐阅读