这是交易:
public static List<Survey> getFilteredSurveys(Municipality municipality, Company company) {
String sql = "SELECT DISTINCT id FROM survey INNER JOIN " +
"(SELECT SURVEY_ID FROM publicity INNER JOIN brand "+
"ON publicity.brand_id=brand.id WHERE brand.company_id="+company.getId()+") "+
"ON survey_id=survey.id WHERE survey.municipality_id="+municipality.getId();
RawSql rawSql = RawSqlBuilder.parse(sql).create();
List<Survey> surveys = Ebean.find(Survey.class).setRawSql(rawSql).findList();
for (Survey survey : surveys) {
List<Publicity> publicities = new ArrayList<>();
for (Publicity publicity : survey.publicities) {
if(publicity.getBrand().getCompany() == company){
publicities.add(publicity);
}
}
survey.setPublicities(publicities);
}
return surveys;
}
这个应用程式的目的是用来衡量特定地点的宣传情况,
因此,人们上载了包含该地点所有“公共性”的地点的“调查”。
该函数应该返回一个List,
每个调查都有一个列表,
每个宣传都有与公司相关的品牌(例如可乐->可口可乐公司)。
我想做的是这样的:
给定公司,请显示所有包含“可口可乐公司”的调查。宣传,但仅显示属于“可口可乐公司”的宣传
我有一个“调查”控制器,该控制器接收带有市政府和公司的表单,并调用此方法,并使用其结果呈现视图。
这是视图模板的一部分:
@(surveys: java.util.List[Survey])
@for(survey <- surveys){
@for(publicity <- survey.getPublicities){
<tr>
<td>@publicity.getBrand.getName</td>
<td>@publicity.getType.getName</td>
<td>@publicity.getSquareMeters</td>
</tr>
}
}
问题:即使我从每个“调查”中删除了一些宣传,所有宣传仍在视图中显示。为什么会这样呢?
我知道我不会保留更改,并且我不想,只是想暂时混淆数据,以便用户只能看到属于给定公司的宣传。
为什么此视图未使用已修改的调查?
最佳答案
其实我会回答这个问题...
您应该在此处查看日志中执行的SQL(因为我怀疑您正在获得N + 1),因此可以很容易地避免这种情况。
您可能应该更改原始sql,以在select子句(名称,类型,squareMeters)中包括publications列,以避免额外的查询。
或者,您可以将fetch(“ publicities”)添加到查询中(以便一次通过查询连接100急切地获取它们)。
另请参阅:
https://github.com/ebean-orm/avaje-ebeanorm/issues/223
...包含OneToMany的RawSql无法正常工作
https://github.com/ebean-orm/avaje-ebeanorm/issues/224
...增强功能添加RawSqlBuilder.tableAliasMapping()
理想情况下,您将能够使用4.5.2并利用该修复程序和增强功能。