【发布时间】:2015-09-03 17:37:17
【问题描述】:
对于我的 (Spring/Hibernate 4.3.11) 申请活动俱乐部组织由会员组织的室内和室外活动,我对我的 Activity 表进行了 Hibernate 查询,该表应该返回登录的活动member 是组织者或参与者之一。从概念上讲,它可以称为“我的活动”。
HQL 看起来像:
select a from Activity as a where (a.organizer = :member or :member in elements(a.participants)) order by a.dateFrom asc, a.timeFrom asc
启动应用程序后,查询返回预期结果。似乎生成了一堆单独的 SQL 查询(从 HQL 到 SQL 的转换对我来说仍然有些神秘!)
在应用程序中单击后,突然查询不再返回任何结果。未进行任何数据更改。
似乎是在单击触发以下代码的活动的编辑链接后出现问题:
public String getActivityForm(@ModelAttribute("loggedinMember") Member loggedinMember, @PathVariable("id") int id, ModelMap model) {
Activity activity = service.findActivityById(id);
if (! activity.getOrganizer().equals(loggedinMember)) {
//throw exception, you can only edit an activity organized by you
System.out.println("You are not the organizer of this activity!");
}
model.addAttribute("activity", activity);
return "activityform";
}
这里没有做任何奇怪的事情,所以我真的不知道什么会触发这个问题。
我查看了生成的 SQL,在没有返回结果的情况下,这要短得多。 SQL 块很长,但我将它们发布在下面。 显然,为每一行生成单独的 SQL 查询! 我真的迷失了,这个问题在我使用更新版本的 Hibernate 后第一次出现。 那么有什么想法...?
SQL 生成所需结果:
Hibernate:
select
activityca0_.id as id1_1_,
activityca0_.description as descript2_1_
from
activitycategory activityca0_
Hibernate:
select
activityre0_.id as id1_2_,
activityre0_.description as descript2_2_
from
activityregion activityre0_
Hibernate:
select
activity0_.id as id1_0_,
activity0_.category_id as categor10_0_,
activity0_.date_from as date_fro2_0_,
activity0_.date_to as date_to3_0_,
activity0_.description as descript4_0_,
activity0_.meetingpoint as meetingp5_0_,
activity0_.organizer_id as organiz11_0_,
activity0_.price as price6_0_,
activity0_.region_id as region_12_0_,
activity0_.time_from as time_fro7_0_,
activity0_.time_to as time_to8_0_,
activity0_.title as title9_0_
from
activity activity0_
where
activity0_.organizer_id=?
or ? in (
select
participan1_.member_id
from
member_activity_subscription participan1_
where
activity0_.id=participan1_.activity_id
)
order by
activity0_.date_from asc,
activity0_.time_from asc
Hibernate:
select
activityca0_.id as id1_1_0_,
activityca0_.description as descript2_1_0_
from
activitycategory activityca0_
where
activityca0_.id=?
Hibernate:
select
member0_.id as id1_3_0_,
member0_.active as active2_3_0_,
member0_.birthdate as birthdat3_3_0_,
member0_.city as city4_3_0_,
member0_.email as email5_3_0_,
member0_.firstname as firstnam6_3_0_,
member0_.interests as interest7_3_0_,
member0_.lastname as lastname8_3_0_,
member0_.lastname_prefix as lastname9_3_0_,
member0_.loginname as loginna10_3_0_,
member0_.mobilephone as mobilep11_3_0_,
member0_.password as passwor12_3_0_,
member0_.summary as summary13_3_0_
from
member member0_
where
member0_.id=?
Hibernate:
select
activityre0_.id as id1_2_0_,
activityre0_.description as descript2_2_0_
from
activityregion activityre0_
where
activityre0_.id=?
Hibernate:
select
activityca0_.id as id1_1_0_,
activityca0_.description as descript2_1_0_
from
activitycategory activityca0_
where
activityca0_.id=?
Hibernate:
select
member0_.id as id1_3_0_,
member0_.active as active2_3_0_,
member0_.birthdate as birthdat3_3_0_,
member0_.city as city4_3_0_,
member0_.email as email5_3_0_,
member0_.firstname as firstnam6_3_0_,
member0_.interests as interest7_3_0_,
member0_.lastname as lastname8_3_0_,
member0_.lastname_prefix as lastname9_3_0_,
member0_.loginname as loginna10_3_0_,
member0_.mobilephone as mobilep11_3_0_,
member0_.password as passwor12_3_0_,
member0_.summary as summary13_3_0_
from
member member0_
where
member0_.id=?
Hibernate:
select
activityre0_.id as id1_2_0_,
activityre0_.description as descript2_2_0_
from
activityregion activityre0_
where
activityre0_.id=?
Hibernate:
select
activityca0_.id as id1_1_0_,
activityca0_.description as descript2_1_0_
from
activitycategory activityca0_
where
activityca0_.id=?
Hibernate:
select
member0_.id as id1_3_0_,
member0_.active as active2_3_0_,
member0_.birthdate as birthdat3_3_0_,
member0_.city as city4_3_0_,
member0_.email as email5_3_0_,
member0_.firstname as firstnam6_3_0_,
member0_.interests as interest7_3_0_,
member0_.lastname as lastname8_3_0_,
member0_.lastname_prefix as lastname9_3_0_,
member0_.loginname as loginna10_3_0_,
member0_.mobilephone as mobilep11_3_0_,
member0_.password as passwor12_3_0_,
member0_.summary as summary13_3_0_
from
member member0_
where
member0_.id=?
Hibernate:
select
activityca0_.id as id1_1_0_,
activityca0_.description as descript2_1_0_
from
activitycategory activityca0_
where
activityca0_.id=?
Hibernate:
select
activityre0_.id as id1_2_0_,
activityre0_.description as descript2_2_0_
from
activityregion activityre0_
where
activityre0_.id=?
Hibernate:
select
activityca0_.id as id1_1_0_,
activityca0_.description as descript2_1_0_
from
activitycategory activityca0_
where
activityca0_.id=?
Hibernate:
select
participan0_.activity_id as activity1_0_0_,
participan0_.member_id as member_i2_4_0_,
member1_.id as id1_3_1_,
member1_.active as active2_3_1_,
member1_.birthdate as birthdat3_3_1_,
member1_.city as city4_3_1_,
member1_.email as email5_3_1_,
member1_.firstname as firstnam6_3_1_,
member1_.interests as interest7_3_1_,
member1_.lastname as lastname8_3_1_,
member1_.lastname_prefix as lastname9_3_1_,
member1_.loginname as loginna10_3_1_,
member1_.mobilephone as mobilep11_3_1_,
member1_.password as passwor12_3_1_,
member1_.summary as summary13_3_1_
from
member_activity_subscription participan0_
inner join
member member1_
on participan0_.member_id=member1_.id
where
participan0_.activity_id=?
Hibernate:
select
participan0_.activity_id as activity1_0_0_,
participan0_.member_id as member_i2_4_0_,
member1_.id as id1_3_1_,
member1_.active as active2_3_1_,
member1_.birthdate as birthdat3_3_1_,
member1_.city as city4_3_1_,
member1_.email as email5_3_1_,
member1_.firstname as firstnam6_3_1_,
member1_.interests as interest7_3_1_,
member1_.lastname as lastname8_3_1_,
member1_.lastname_prefix as lastname9_3_1_,
member1_.loginname as loginna10_3_1_,
member1_.mobilephone as mobilep11_3_1_,
member1_.password as passwor12_3_1_,
member1_.summary as summary13_3_1_
from
member_activity_subscription participan0_
inner join
member member1_
on participan0_.member_id=member1_.id
where
participan0_.activity_id=?
Hibernate:
select
participan0_.activity_id as activity1_0_0_,
participan0_.member_id as member_i2_4_0_,
member1_.id as id1_3_1_,
member1_.active as active2_3_1_,
member1_.birthdate as birthdat3_3_1_,
member1_.city as city4_3_1_,
member1_.email as email5_3_1_,
member1_.firstname as firstnam6_3_1_,
member1_.interests as interest7_3_1_,
member1_.lastname as lastname8_3_1_,
member1_.lastname_prefix as lastname9_3_1_,
member1_.loginname as loginna10_3_1_,
member1_.mobilephone as mobilep11_3_1_,
member1_.password as passwor12_3_1_,
member1_.summary as summary13_3_1_
from
member_activity_subscription participan0_
inner join
member member1_
on participan0_.member_id=member1_.id
where
participan0_.activity_id=?
Hibernate:
select
participan0_.activity_id as activity1_0_0_,
participan0_.member_id as member_i2_4_0_,
member1_.id as id1_3_1_,
member1_.active as active2_3_1_,
member1_.birthdate as birthdat3_3_1_,
member1_.city as city4_3_1_,
member1_.email as email5_3_1_,
member1_.firstname as firstnam6_3_1_,
member1_.interests as interest7_3_1_,
member1_.lastname as lastname8_3_1_,
member1_.lastname_prefix as lastname9_3_1_,
member1_.loginname as loginna10_3_1_,
member1_.mobilephone as mobilep11_3_1_,
member1_.password as passwor12_3_1_,
member1_.summary as summary13_3_1_
from
member_activity_subscription participan0_
inner join
member member1_
on participan0_.member_id=member1_.id
where
participan0_.activity_id=?
Hibernate:
select
participan0_.activity_id as activity1_0_0_,
participan0_.member_id as member_i2_4_0_,
member1_.id as id1_3_1_,
member1_.active as active2_3_1_,
member1_.birthdate as birthdat3_3_1_,
member1_.city as city4_3_1_,
member1_.email as email5_3_1_,
member1_.firstname as firstnam6_3_1_,
member1_.interests as interest7_3_1_,
member1_.lastname as lastname8_3_1_,
member1_.lastname_prefix as lastname9_3_1_,
member1_.loginname as loginna10_3_1_,
member1_.mobilephone as mobilep11_3_1_,
member1_.password as passwor12_3_1_,
member1_.summary as summary13_3_1_
from
member_activity_subscription participan0_
inner join
member member1_
on participan0_.member_id=member1_.id
where
participan0_.activity_id=?
Hibernate:
select
participan0_.activity_id as activity1_0_0_,
participan0_.member_id as member_i2_4_0_,
member1_.id as id1_3_1_,
member1_.active as active2_3_1_,
member1_.birthdate as birthdat3_3_1_,
member1_.city as city4_3_1_,
member1_.email as email5_3_1_,
member1_.firstname as firstnam6_3_1_,
member1_.interests as interest7_3_1_,
member1_.lastname as lastname8_3_1_,
member1_.lastname_prefix as lastname9_3_1_,
member1_.loginname as loginna10_3_1_,
member1_.mobilephone as mobilep11_3_1_,
member1_.password as passwor12_3_1_,
member1_.summary as summary13_3_1_
from
member_activity_subscription participan0_
inner join
member member1_
on participan0_.member_id=member1_.id
where
participan0_.activity_id=?
Aantal activiteiten: 6
Handling GET request, activities = [nl.drsklaus.activiteitensite.model.Activity@8070e879, nl.drsklaus.activiteitensite.model.Activity@ac6b814e, nl.drsklaus.activiteitensite.model.Activity@e5b2a54b, nl.drsklaus.activiteitensite.model.Activity@97726734, nl.drsklaus.activiteitensite.model.Activity@2d0defe, nl.drsklaus.activiteitensite.model.Activity@f2f57489]
SQL 生成空结果:
Hibernate:
select
activityca0_.id as id1_1_,
activityca0_.description as descript2_1_
from
activitycategory activityca0_
Hibernate:
select
activityre0_.id as id1_2_,
activityre0_.description as descript2_2_
from
activityregion activityre0_
Hibernate:
select
activity0_.id as id1_0_,
activity0_.category_id as categor10_0_,
activity0_.date_from as date_fro2_0_,
activity0_.date_to as date_to3_0_,
activity0_.description as descript4_0_,
activity0_.meetingpoint as meetingp5_0_,
activity0_.organizer_id as organiz11_0_,
activity0_.price as price6_0_,
activity0_.region_id as region_12_0_,
activity0_.time_from as time_fro7_0_,
activity0_.time_to as time_to8_0_,
activity0_.title as title9_0_
from
activity activity0_
where
activity0_.organizer_id=?
or ? in (
select
participan1_.member_id
from
member_activity_subscription participan1_
where
activity0_.id=participan1_.activity_id
)
order by
activity0_.date_from asc,
activity0_.time_from asc
Aantal activiteiten: 0
Handling GET request, activities = []
议程(我的活动)页面的代码如下所示:
@RequestMapping(value = "/subscribed", method = RequestMethod.GET)
public String home(@ModelAttribute("loggedinMember") Member member, ModelMap model) {
List<Activity> activities = service.findAllActivitiesForMember(member, true);
System.out.println("Aantal activiteiten: " + activities.size());
System.out.println("Handling GET request, activities = " + activities);
model.addAttribute("activitiessubscribed", activities);
return "myactivities";
}
service 方法被委托给 dao 方法,如下所示:
@Override
public List<Activity> findAllActivitiesForMember(Member member, boolean upcoming) {
String hql = "select a from Activity as a where (a.organizer = :member or :member in elements(a.participants))";
if (upcoming) {
hql += " order by a.dateFrom asc, a.timeFrom asc";
} else {
hql += " order by a.dateTo desc, a.timeTo desc";
}
System.out.println("HQL: " + hql);
Query query = this.getSession().createQuery(hql);
query.setEntity("member", member);
return query.list();
}
使用以下网址:
第一次访问我的活动议程(正常结果: http://localhost:8080/ActiviteitenSite/activities/subscribed
选择特定活动: http://localhost:8080/ActiviteitenSite/activities/3
返回(仍然是正常结果): http://localhost:8080/ActiviteitenSite/activities/subscribed
编辑活动(屏幕显示活动详细信息,不提交): http://localhost:8080/ActiviteitenSite/activities/3/edit
再次访问我的议程(结果现在为空): http://localhost:8080/ActiviteitenSite/activities/subscribed
【问题讨论】:
-
第二组查询较短的原因可能是第二组中不存在的实体被缓存了吗?您是否确保为 finder-method 提供了正确的 id?您能否发布调用服务方法的代码以及服务方法本身
-
finder方法中的id正确,详情页显示选中的activity。但是当我返回“议程”页面时,会显示空结果。我还没有实现任何缓存 AFAIK...
-
嗯。那么请您发布议程页面的代码。在您导航到详细信息页面之前和之后,会向您显示哪些网址?是一部追溯历史的作品吗?
-
我发布了这个信息,但我担心这并没有什么奇怪的...... :(
-
Member 对象的 id 值似乎已损坏。 Session中保存了Member对象,id属性值为1000,即数据库中的值。在查询失败期间,id 值已更改为 3,并且由于使用 id 值进行匹配(这是在 Member 类的 equals 方法中实现的),因此找不到匹配项。我仍在弄清楚这发生在哪里......
标签: hibernate spring-mvc