gpt4 book ai didi

java - 执行查询后,Hibernate 返回对象的时间太长

转载 作者:行者123 更新时间:2023-12-04 02:05:22 26 4
gpt4 key购买 nike

我有一个查询返回单个类的大约 1200 个元素。我已经使用 log4jdbc 对查询执行进行了概要分析,查询本身的运行时间约为 70 毫秒;但是我的 dao 方法(以 return query.list() 结尾)需要很长时间才能将对象列表返回到我的服务(最多 7 秒),就好像问题与映射有某种关系一样.

这是我的课:

@Entity
@Table(name = "unidad_funcional", uniqueConstraints = { @UniqueConstraint(columnNames = { "id_unidad_funcional", "id_subempresa" }) })
public class UnidadFuncional extends AbstractEntity {

/**
*
*/
private static final long serialVersionUID = 1L;


@Id
@Column(name = "id_unidad_funcional_PK")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "gen_UF")
@SequenceGenerator(name = "gen_UF", sequenceName = "SEQ_unidad_funcio_id_unidad_fu")
private Integer idUnidadFuncionalPK;

@Column(name = "id_unidad_funcional")
private String idUnidadFuncional;

@Column(name = "unidad_funcional")
private String unidadFuncional;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_subempresa")
private SubEmpresa subEmpresa;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "id_agrupacion_funcional")
private AgrupacionFuncional agrupacionFuncional;

@OneToMany(fetch = FetchType.LAZY, mappedBy = "unidadFuncional")
private Set<Contrato> contratos = new HashSet<Contrato>();

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "up_unidad_funcional", joinColumns = { @JoinColumn(name = "id_unidad_planificacion") }, inverseJoinColumns = { @JoinColumn(name = "id_unidad_funcional") })
private Set<UnidadPlanificacion> unidadesPlanificacion = new HashSet<UnidadPlanificacion>();

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "unidad_funcional_centro", joinColumns = { @JoinColumn(name = "id_unidad_funcional") }, inverseJoinColumns = { @JoinColumn(name = "id_centro") })
private Set<Centro> centros = new HashSet<Centro>();

(....)
}

这是被执行的查询:

 select
distinct unidadfunc0_.id_unidad_funcional_PK as id1_45_,
unidadfunc0_.borrado as borrado45_,
unidadfunc0_.fecha_alta as fecha3_45_,
unidadfunc0_.propietario as propieta4_45_,
unidadfunc0_.fecha_modificacion as fecha5_45_,
unidadfunc0_.version as version45_,
unidadfunc0_.id_agrupacion_funcional as id9_45_,
unidadfunc0_.id_unidad_funcional as id7_45_,
unidadfunc0_.id_subempresa as id10_45_,
unidadfunc0_.unidad_funcional as unidad8_45_
from
unidad_funcional unidadfunc0_
where
unidadfunc0_.borrado = ?
order by
lower(unidadfunc0_.unidad_funcional) asc

我知道我有几个关系,但我检查了一下,没有获取这些关系——所以这不是问题所在。

我觉得 1200 个元素对于 Hibernate 来说花那么长时间来映射对象(特别是对于这么小的对象)来说并不算多,所以任何关于问题出在哪里的提示都将不胜感激。

编辑:这是查询代码(使用 queryDSL——我也尝试了一个没有过滤的简单条件):

public List<UnidadFuncional> getUnidadesFuncionalesByFiltros(UnidadFuncionalFiltro filtro) {

final JPAQuery query = new JPAQuery(getEntityManager());
final JPAQuery subQuerySubEmpresas = new JPAQuery(getEntityManager());
final QUnidadFuncional qu = QUnidadFuncional.unidadFuncional1;
final QSubEmpresa qsub = QSubEmpresa.subEmpresa;

query.from(qu);
if(filtro.isIncluirDesactivados()) {
disableFilterByDeleted();
}
if(StringUtils.isNotBlank(filtro.getIdCentro())){
query.where(qu.subEmpresa().centros.any().idCentro.eq(filtro.getIdCentro()));
}

if(!filtro.getIdSubempresa().equals("")) {
query.where(qu.subEmpresa().idSubempresa.eq(Integer.parseInt(filtro.getIdSubempresa())));
}
if(!filtro.getIdEmpresa().equals("")){
subQuerySubEmpresas.from(qsub);
subQuerySubEmpresas.where(qsub.empresa().idEmpresa.eq(Integer.parseInt(filtro.getIdEmpresa())));
List<Integer> lista = subQuerySubEmpresas.listDistinct(qsub.idSubempresa);
if (lista != null && lista.size() > 0) {
query.where(qu.subEmpresa().idSubempresa.in(lista));
}
}
query.orderBy(qu.unidadFuncional.toLowerCase().asc());
return query.listDistinct(qu);

PD:顺便说一句,这只是一个例子,但这实际上发生在我的大多数实体中!

最佳答案

好吧,我会看 3 个地方。

1) 仅仅因为查询完成执行并不意味着您已经完成了对数据库的 IO。如果这些记录很大或您的连接速度很慢,则获取每条记录可能会导致速度问题。

2) 您是否使用 show_sql = true 来确保在创建对象时没有运行大量子查询?

3) 它完全在别的地方。当我在查询后在一个大循环中连接字符串时,我就做过类似的事情。切换到将所有内容附加到 StringBuilder 可以节省大量资金。

关于java - 执行查询后,Hibernate 返回对象的时间太长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26808905/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com