这是交易:

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并利用该修复程序和增强功能。

10-05 18:49