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

标签 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;
}

此应用程序旨在衡量特定地点的宣传情况, 因此,人们上传了一个地点的“调查”,其中包含该地点的所有“宣传”。

该函数应该返回一个列表, 每个调查都有一个列表, 每个宣传都有一个品牌,该品牌与一个公司相关联(例如可口可乐 -> 可口可乐公司)

我想做的是: 给定一家公司,显示包含“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/

相关文章:

java.io.IOException : Reason for inactivity is mandatory when insert data on salesforce

java - 大数据的空请求体

java - 关系数据不在 Ebean 中获取

postgresql - 使用 PostgreSQL "INSERT ... RETURNING"的 Ebean Sql 查询

java - ebean 的更新方法在 playframework 中不起作用

java - 使用套接字从 Android 设备连接到 ESP8266

java - Java计算Excel某列重复行数

java - ArrayList 问题 - 计算航空里程份额

javascript - Scala Play : Concurent. 广播无法与 EventSource 配合使用

html - 附件 + 电子邮件 + HTML + Play 框架