sql - 如何优化 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
解决方案
我的建议是:
- 将查询声明为带注释的名称查询,因为在启动时,在 CDI 扫描期间,hibernate 会构建元数据缓存和执行计划,从而使执行速度更快。
- 使用 FetchType.LAZY 生成单个 JOIN 本机查询。
- 在您的查询上设置
QueryHints.HINT_READONLY
为true
防止休眠实例化所有脏标志和状态跟踪基础设施。
推荐阅读
- python - Python“导入请求”返回 500 内部服务器错误
- scala - 相反,将 DataFrame 提取到案例类中会导致读取 Tuple1
- java - 使用 JavaPlot 时如何将特定命令传递给 gnuplot
- html - HTML - 响应式导航栏:脚本不起作用
- python - 如何使用 Flask 在 Heroku 中显示标准输出日志?
- python - URL 参数中断 Flask 模板
- c# - 如何使用.Net HttpWebRequest通过http一致地发送大图像?
- javascript - FileReader 未触发加载事件
- dns - 安装 ejabberd 后如何处理?
- linux - Chromedriver 无法在 AWS EC2 上打开 chrome 浏览器