【发布时间】:2014-07-27 21:55:37
【问题描述】:
Hibernate 似乎在每次选择后都会这样做:
Hibernate: select role0_.user_id as user_id1_3_1_, role0_.user_role_id as user_rol2_12_1_,
role1_.user_role_id as user_rol1_11_0_, role1_.role as role2_11_0_ from user_roles role0_
inner join user_role role1_ on role0_.user_role_id=role1_.user_role_id where
role0_.user_id=?
休眠:选择 emailrecei0_.email_received_id 作为 email_re1_0_5_, emailrecei0_.deleted_flag as deleted_2_0_5_, emailrecei0_.email_body 作为 email_bo3_0_5_,emailrecei0_.email_subject 作为 email_su4_0_5_, emailrecei0_.email_from_id 为 email_fr6_0_5_, emailrecei0_.received_date as received5_0_5_, emailrecei0_.email_to_id 作为 email_to7_0_5_,m2duser1_.user_id 作为 user_id1_3_0_, m2duser1_.account_locked 为 account_2_3_0_,m2duser1_.active_flag 为 active_f3_3_0_,m2duser1_.cell_number 为 cell_num4_3_0_, m2duser1_.email_address 为 email_ad5_3_0_,m2duser1_.first_name 为 first_na6_3_0_, m2duser1_.home_number 为 home_num7_3_0_, m2duser1_.join_date 作为 join_dat8_3_0_,m2duser1_.last_login_date 作为 last_log9_3_0_, m2duser1_.last_name 为 last_na10_3_0_, m2duser1_.login_ip 作为 login_i11_3_0_,m2duser1_.password 作为 passwor12_3_0_, m2duser1_.system_message 作为 system_13_3_0_, m2duser1_.ref_table_user_type_id 作为 ref_tab15_3_0_, m2duser1_.username 作为 usernam14_3_0_,m2duser1_.zipcode_id 作为 zipcode16_3_0_, role2_.user_id 为 user_id1_3_7_,role3_.user_role_id 为 user_rol2_12_7_, role3_.user_role_id as user_rol1_11_1_, role3_.role 作为角色 2_11_1_,reftable4_.ref_table_id 作为 ref_tabl1_10_2_, reftable4_.ref_type_code 为 ref_type2_10_2_,reftable4_.description 为 descript3_10_2_, reftable4_.ref_type_group 为 ref_type4_10_2_, reftable4_.ui_sort_order as ui_sort_5_10_2_, zipcode5_.zipcode_id as zipcode_1_13_3_, zipcode5_.city 为 city2_13_3_, zipcode5_.city_long 为 city_lon3_13_3_, zipcode5_.latitude 为 latitude4_13_3_, zipcode5_.longitude as longitud5_13_3_, zipcode5_.state as state6_13_3_, zipcode5_.zipcode as zipcode7_13_3_, m2duser6_.user_id 作为 user_id1_3_4_,m2duser6_.account_locked 作为 account_2_3_4_, m2duser6_.active_flag 为 active_f3_3_4_,m2duser6_.cell_number 为 cell_num4_3_4_,m2duser6_.email_address 作为 email_ad5_3_4_, m2duser6_.first_name 作为 first_na6_3_4_,m2duser6_.home_number 作为 home_num7_3_4_,m2duser6_.join_date 作为 join_dat8_3_4_, m2duser6_.last_login_date 为 last_log9_3_4_,m2duser6_.last_name 为 last_na10_3_4_, m2duser6_.login_ip 作为 login_i11_3_4_, m2duser6_.password 作为 passwor12_3_4_,m2duser6_.system_message 作为 system_13_3_4_,m2duser6_.ref_table_user_type_id 作为 ref_tab15_3_4_, m2duser6_.username 为 usernam14_3_4_,m2duser6_.zipcode_id 为 zipcode16_3_4_ from email_received emailrecei0_ 左外连接 m2d_user m2duser1_ on emailrecei0_.email_from_id=m2duser1_.user_id 在 m2duser1_.user_id=role2_.user_id 上左外加入 user_roles role2_ 左外连接 user_role role3_ on role2_.user_role_id=role3_.user_role_id 左外连接 ref_table m2duser1_.ref_table_user_type_id=reftable4_.ref_table_id 上的 reftable4_ 左外连接 zipcode zipcode5_ on m2duser1_.zipcode_id=zipcode5_.zipcode_id 左外连接 m2d_user m2duser6_ on emailrecei0_.email_to_id=m2duser6_.user_id 其中 emailrecei0_.email_received_id=? 2014-06-04 22:05:46,118 调试 | tomcat-http--16 | org.hibernate.loader.Loader
|结果集行:0 2014-06-04 22:05:46,120 DEBUG | tomcat-http--16 | org.hibernate.loader.Loader |结果行: EntityKey[com.testApp.meals2day.model.M2DUser#2], EntityKey[com.testApp.meals2day.model.Role#1], EntityKey[com.testApp.meals2day.model.RefTable#1], EntityKey[com.testApp.meals2day.model.Zipcode#1], EntityKey[com.testApp.meals2day.model.M2DUser#1], EntityKey[com.testApp.meals2day.model.EmailReceived#14] 2014-06-04 22:05:46,121 调试 | tomcat-http--16 | org.hibernate.loader.Loader
|找到的集合行: [com.testApp.meals2day.model.M2DUser.role#2] 2014-06-04 22:05:46,121 调试 | tomcat-http--16 | org.hibernate.engine.internal.TwoPhaseLoad
|解决 [com.testApp.meals2day.model.M2DUser#2] 的关联 2014-06-04 22:05:46,122 调试 | tomcat-http--16 | org.hibernate.engine.internal.TwoPhaseLoad |完毕 实体化实体 [com.testApp.meals2day.model.M2DUser#2] 2014-06-04 22:05:46,122 调试 | tomcat-http--16 | org.hibernate.engine.internal.TwoPhaseLoad |正在解决 [com.testApp.meals2day.model.Role#1] 的关联 2014-06-04 22:05:46,122 调试 | tomcat-http--16 | org.hibernate.engine.internal.TwoPhaseLoad |完毕 实体化实体 [com.testApp.meals2day.model.Role#1] 2014-06-04 22:05:46,122 调试 | tomcat-http--16 | org.hibernate.engine.internal.TwoPhaseLoad |正在解决 [com.testApp.meals2day.model.RefTable#1] 的关联 2014-06-04 22:05:46,123 调试 | tomcat-http--16 | org.hibernate.engine.internal.TwoPhaseLoad |完毕 实体化实体 [com.testApp.meals2day.model.RefTable#1] 2014-06-04 22:05:46,123 调试 | tomcat-http--16 | org.hibernate.engine.internal.TwoPhaseLoad |正在解决 [com.testApp.meals2day.model.Zipcode#1] 的关联 2014-06-04 22:05:46,123 调试 | tomcat-http--16 | org.hibernate.engine.internal.TwoPhaseLoad |完毕 实体化实体 [com.testApp.meals2day.model.Zipcode#1] 2014-06-04 22:05:46,123 调试 | tomcat-http--16 | org.hibernate.engine.internal.TwoPhaseLoad |正在解决 [com.testApp.meals2day.model.M2DUser#1] 的关联 2014-06-04 22:05:46,123 调试 | tomcat-http--16 | org.hibernate.engine.internal.TwoPhaseLoad |完毕 实体化实体 [com.testApp.meals2day.model.M2DUser#1] 2014-06-04 22:05:46,124 调试 | tomcat-http--16 | org.hibernate.engine.internal.TwoPhaseLoad |正在解决 [com.testApp.meals2day.model.EmailReceived#14] 的关联 2014-06-04 22:05:46,124 调试 | tomcat-http--16 | org.hibernate.engine.internal.TwoPhaseLoad |完毕 实体化实体 [com.testApp.meals2day.model.EmailReceived#14] 2014-06-04 22:05:46,124 调试 | tomcat-http--16 | o.h.engine.loading.internal.CollectionLoadContext | 1 在角色的结果集中找到了集合: com.testApp.meals2day.model.M2DUser.role 2014-06-04 22:05:46,124 调试 | tomcat-http--16 | o.h.engine.loading.internal.CollectionLoadContext |收藏 完全初始化:[com.testApp.meals2day.model.M2DUser.role#2] 2014-06-04 22:05:46,124 调试 | tomcat-http--16 | o.h.engine.loading.internal.CollectionLoadContext | 1 为角色初始化的集合: com.testApp.meals2day.model.M2DUser.role 2014-06-04 22:05:46,125 调试 | tomcat-http--16 | org.hibernate.loader.Loader
|加载集合:[com.testApp.meals2day.model.M2DUser.role#1] 2014-06-04 22:05:46,125 调试 | tomcat-http--16 | org.hibernate.SQL
|选择 role0_.user_id 作为 user_id1_3_1_,role0_.user_role_id 作为 user_rol2_12_1_, role1_.user_role_id as user_rol1_11_0_, role1_.role as role2_11_0_ from user_roles role0_ inner join user_role role1_ on role0_.user_role_id=role1_.user_role_id 其中role0_.user_id=?Hibernate:选择 role0_.user_id 作为 user_id1_3_1_, role0_.user_role_id 作为 user_rol2_12_1_,role1_.user_role_id 作为 user_rol1_11_0_, role1_.role as role2_11_0_ from user_roles role0_ inner join user_role role1_ on role0_.user_role_id=role1_.user_role_id 其中 role0_.user_id=?
2014-06-04 22:05:46,131 调试 | tomcat-http--16 | org.hibernate.loader.Loader |结果集 包含(可能为空)集合: [com.testApp.meals2day.model.M2DUser.role#1] 2014-06-04 22:05:46,131 调试 | tomcat-http--16 | org.hibernate.loader.Loader
|结果集行:0 2014-06-04 22:05:46,131 DEBUG | tomcat-http--16 | org.hibernate.loader.Loader |结果行: EntityKey[com.testApp.meals2day.model.Role#1] 2014-06-04 22:05:46,131 调试 | tomcat-http--16 | org.hibernate.loader.Loader
|找到的集合行: [com.testApp.meals2day.model.M2DUser.role#1] 2014-06-04 22:05:46,131 调试 | tomcat-http--16 | o.h.engine.loading.internal.CollectionLoadContext | 1 在角色的结果集中找到了集合: com.testApp.meals2day.model.M2DUser.role 2014-06-04 22:05:46,131 调试 | tomcat-http--16 | o.h.engine.loading.internal.CollectionLoadContext |收藏 完全初始化:[com.testApp.meals2day.model.M2DUser.role#1] 2014-06-04 22:05:46,132 调试 | tomcat-http--16 | o.h.engine.loading.internal.CollectionLoadContext | 1 为角色初始化的集合: com.testApp.meals2day.model.M2DUser.role 2014-06-04 22:05:46,132 调试 | tomcat-http--16 | org.hibernate.loader.Loader
|完成加载集合
@OneToMany(fetch=FetchType.EAGER)
@JoinTable(name="user_roles",
joinColumns = @JoinColumn( name="user_id"),
inverseJoinColumns = @JoinColumn( name="user_role_id"))
private Set<Role> role;
public Collection<? extends GrantedAuthority> getAuthorities() {
List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
for (Role r : role) {
authorities.add(new SimpleGrantedAuthority(r.getRole()));
}
return authorities;
}
分隔符 $$
CREATE TABLE `user_role` (
`user_role_id` int(11) NOT NULL AUTO_INCREMENT,
`role` varchar(45) DEFAULT NULL,
PRIMARY KEY (`user_role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1$$
@Query(value="select er from EmailReceived er JOIN FETCH er.toUser tu JOIN FETCH er.fromUser fu where er.toUser.userId = ?1",
countQuery="select count(er) from EmailReceived er where er.toUser.userId = ?1")
Page<EmailReceived> findEmailReceivedByUserId(Integer userId, Pageable pageable);
我的问题是为什么它会在初始页面选择后进入数据库?它可以很好地返回页面对象..但会转到结果页面中每一行的数据库。
我刚刚从存储过程转移到 Spring/JPA/Paging。我看到分页和正确的结果。它真的很慢。
Hibernate 在分页结果中的每一行都调用上面的这个选择。 任何帮助表示赞赏?
【问题讨论】:
-
你能澄清你的问题吗?
-
感谢您的回复。它可以工作,但速度很慢。为什么在呼唤。 Hibernate:为每一行选择 role0_.user_id 作为 user_id1_3_1_,role0_.user_role_id 作为 user_rol2_12_1_?
标签: spring hibernate datatable spring-security