我正在尝试优化目前比预期时间稍长的查询。该查询返回大约11000个实体,但由于它们有点复杂并且具有嵌套实体,因此它有点慢。由于我不打算修改实体,我尝试将查询/会话设置为只读,但它没有帮助,它仍然需要一段时间,也许我做错了。下面是一个简化的代码,抱歉它有点乱:
@Entity
@NamedQueries(value = {@NamedQuery(name = "demand.all", query = "select d from Demand d")})
public class Demand {
private Long ID;
private Division division;
private Client client;
private Product product;
private String code;
...
}
@Transactional(readOnly=true)
public List<Demand> getAll() {
SessionImpl sessionImpl = ((SessionImpl)em.getDelegate());
Session session = sessionImpl.getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
try {
sessionImpl.connection().setReadOnly(true);
Query query = session.getNamedQuery("demand.all");
List<Demand> resultList = query.setReadOnly(true).setCacheable(false).setFlushMode(FlushMode.MANUAL).list();
sessionImpl.connection().setReadOnly(false);
tx.commit();
} catch(Exception e) {
resultList = null;
}
session.close();
return resultList;
}
我读到将查询设置为只读是不够的,所以我也尝试将连接和事务设置为只读,但我不确定是否有必要。无论如何,我做错了什么?还有哪些方法可以优化此查询?
答案 0 :(得分:1)
更快地做到这一点的一种方法是以懒惰的方式获取对象,或者取决于哪些是必要的而哪些不是。也许你只需要在一个表中显示5列,而不是层次结构中的每一个对象,所以你创建DTO来获取它们。如果你需要关于其中一个的更多信息..让我们说用户点击一行,那么你将带来它的整个对象层次结构..
它可能不适用于您的情况,但它是一种有效获取数据的方法。