【发布时间】:2024-05-16 19:00:02
【问题描述】:
我在休眠时遇到了投影问题,完成一个简单的查询需要很长时间。 我的道法:
@Override @Transactional public List<String> getSourcePaths(List<Integer> sourceIds) { @SuppressWarnings("unchecked") List<String> list = getSession() .createCriteria(AnaFileDB.class) .setProjection(Projections.property("sourcePath")) .add(Restrictions.in("source.id", sourceIds)) .list(); return list; }
AnaFileDB 类是这样的:
@Entity @Table(name = "ANA_FILE") public class AnaFileDB { ... private String sourcePath; private AnaFileSourceDB source; ... }
日志:
2014-01-15 17:31:36,227 [http-8080-5] 调试 org.hibernate.jdbc.AbstractBatcher - 即将打开 PreparedStatement(打开 PreparedStatements:0,全局:0)
休眠:
/* 条件查询 */ select
this_.FILE_SOURCE_PATH 作为 y0_
来自
ANA_FILE 这个_
在哪里
this_.FILE_SOURCE_ID (
?
)
2014-01-15 17:31:36,227 [http-8080-5] TRACE org.hibernate.type.IntegerType - 将“2”绑定到参数:1
2014-01-15 18:17:43,569 [http-8080-5] 调试 org.hibernate.jdbc.AbstractBatcher - 即将打开 ResultSet(打开 ResultSets:0,全局:0)
2014-01-15 18:17:43,569 [http-8080-5] 调试 org.hibernate.loader.Loader - 结果行:
2014-01-15 18:17:43,569 [http-8080-5] TRACE org.hibernate.type.StringType - 返回 '2013.03.01_Tom Januario/01_CTG1203401_CTG.csv' 作为列:y0_
2014-01-15 18:17:43,570 [http-8080-5] 调试 org.hibernate.loader.Loader - 结果行:
2014-01-15 18:17:43,570 [http-8080-5] TRACE org.hibernate.type.StringType - 返回 '2013.03.01_Tom Januario/02_CTG2203539_CTG.csv' 作为列:y0_
2014-01-15 18:17:43,570 [http-8080-5] 调试 org.hibernate.loader.Loader - 结果行:
2014-01-15 18:17:43,570 [http-8080-5] TRACE org.hibernate.type.StringType - 返回 '2013.03.01_Tom Januario/03_CTG3203718_CTG.csv' 作为列:y0_
由于有很多行(数万行),我得到了一大堆这样的日志文件
2014-01-15 17:13:40,462 [http-8080-1] 调试 org.hibernate.loader.Loader - 结果行:
2014-01-15 17:13:40,462 [http-8080-1] TRACE org.hibernate.type.StringType - 返回 'project2/screen4/run4/CTG/CSI000000447_CTG.csv' 作为列:y0_
如何解决?
【问题讨论】:
-
hibernate 有什么特别之处呢?仅使用 JDBC 加载“数万”行的速度是否显着加快?