Play框架2.2.X上的对象修改不一致

时间:2014-12-16 05:34:37

标签: java playframework ebean

这是这笔交易:

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>
    }
}

问题:尽管我从每次调查中删除了一些宣传,但所有的宣传都出现在视图中。为什么会这样? 我知道我没有坚持更改,我不想,我只想暂时模糊数据,以便用户只看到属于某个公司的宣传。 为什么这个观点没有使用调查,因为它们被赋予了它,被修改了?

2 个答案:

答案 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)只显示了与我选择的公司相对应的宣传。