这是这笔交易:
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;
}
此应用程序用于衡量特定地点的宣传, 因此,人们上传了一份调查报告。包含所有&#39;宣传&#39;的地方那个地方有。
该函数应该返回List, 每个调查都有一个清单, 每个宣传都有一个品牌,与公司相关(例如可口可乐 - &gt;可口可乐公司。)
我想要做的是: 鉴于公司,显示包含可口可乐公司的所有调查。&#39;宣传,但仅展示属于可口可乐公司的宣传品。&#39;
我有一个&#39;调查&#39;接收具有市政当局和公司的表格的控制器调用此方法,并使用其结果呈现视图。
这是视图模板的一部分:
@(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>
}
}
问题:尽管我从每次调查中删除了一些宣传,但所有的宣传都出现在视图中。为什么会这样? 我知道我没有坚持更改,我不想,我只想暂时模糊数据,以便用户只看到属于某个公司的宣传。 为什么这个观点没有使用调查,因为它们被赋予了它,被修改了?
答案 0 :(得分:0)
其实我会把它放在答案中......
你应该看看日志中执行的SQL(因为我怀疑你得到了N + 1),你可以相当容易地避免这种情况。
您可能应该更改原始sql以在select子句(name,type,squareMeters)中包含publicities列,以避免额外的查询。
或者,您可以在查询中添加fetch(&#34; publicities&#34;)(以便一次通过查询连接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并利用该修复和增强功能。
答案 1 :(得分:-1)
所以,我找到了修复, 我的修复是:
for (Survey survey : surveys) {
survey.getAddress(); //This line fixes the issue
List<Publicity> publicities = new ArrayList<>();
for (Publicity publicity : survey.publicities) {
if(publicity.getBrand().getCompany() != null){
if(publicity.getBrand().getCompany().getId().equals(company.getId())){
publicities.add(publicity);
}
}
}
survey.setPublicities(publicities);
}
我的猜测是问题在于ebean懒惰地实例化对象,尽管将Publicities设置为FetchType.EAGER
,并且此函数的输出是预期的,同时检查surveys
in控制器似乎没问题,视图中的@println(surveys)
只显示了与我选择的公司相对应的宣传。