这是交易:
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;
}
此应用程序旨在衡量特定地点的宣传情况, 因此,人们上传了一个地点的“调查”,其中包含该地点的所有“宣传”。
该函数应该返回一个列表, 每个调查都有一个列表, 每个宣传都有一个品牌,该品牌与一个公司相关联(例如可口可乐 -> 可口可乐公司)
我想做的是: 给定一家公司,显示包含“Coca Cola Co.”的所有调查宣传,但仅显示属于“可口可乐公司”的宣传
我有一个“调查” Controller ,它接收带有市政府和公司的表单,调用此方法,并呈现带有结果的 View 。
这是 View 模板的一部分:
@(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>
}
}
问题:尽管我从每个调查中删除了一些宣传,但所有宣传都显示在 View 中。为什么会发生这种情况? 我知道我不会保留更改,我也不想这样做,我只是想暂时混淆数据,以便用户只能看到属于给定公司的宣传。 为什么这个 View 没有使用所提供的调查来进行修改?
最佳答案
实际上我会把这个放在答案中......
您应该查看日志中执行的 SQL(因为我怀疑您得到的是 N+1),您可以很容易地避免这种情况。
您可能应该更改原始 SQL,以在 select 子句中包含公共(public)信息列(名称、类型、平方米),以避免额外的查询。
或者,您可以将 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 并利用该修复和增强功能。
关于java - Play 框架 2.2.X 上的对象修改不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27498165/