繁体   English   中英

Ebean和播放! 不使用.select()过滤列

[英]Ebean and Play! not filtering columns with .select()

我正在尝试使用Play中的 Ebean来获取模型的一部分 Framework ,但是我遇到了一些问题,但没有找到任何解决方案。

我有以下模型:

User

@Entity
@Table(name = "users")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User extends Model{
    @Id
    private int id;
    @NotNull
    @Column(name = "first_name", nullable = false)
    private String firstName;
    @Column(name = "last_name")
    private String lastName;
    @NotNull
    @Column(nullable = false)
    private String username;
    @NotNull
    @Column(nullable = false)
    private String email;
    private String gender;
    private String locale;
    private Date birthday;
    private String bio;
    @NotNull
    @Column(nullable = false)
    private boolean active;
    private String avatar;
    @Column(name = "created_at",nullable = false)
    private Date createdAt;

    @OneToMany
    private List<UserToken> userTokens;

    // Getters and Setters omitted for brevity
}

UserToken

@Entity
@Table(name = "user_tokens")
public class UserToken extends Model {
    @Id
    private int id;
    @Column(name = "user_id")
    private int userId;
    private String token;
    @Column(name = "created_at")
    @CreatedTimestamp
    private Date createdAt;

    @ManyToOne
    private User user;

    // Getters and Setters omitted for brevity
}

然后,我有一个控制器UserController

public class UserController extends Controller{
    public static Result list(){
        User user = Ebean.find(User.class).select("firstName").where().idEq(1).findUnique();
        return Results.ok(Json.toJson(user));
    }
}

我希望当使用.select() ,它将过滤字段并加载部分对象,但它将完全加载它。 在日志中,还有更多我不知道为什么会发生的问题。

报表日志

它正在进行3个查询。 首先是我想要的。 然后,它使一个来获取整个模型,并使其另一个来找到UserTokens 我不知道为什么要执行这最后两个查询,我只想执行第一个查询。

解决方案编辑

在已经接受了我必须按照@biesior的建议来构建Json的事实之后,我( 无处不在 )找到了解决方案!

public static Result list() throws JsonProcessingException {
    User user = Ebean.find(User.class).select("firstName").where().idEq(1).findUnique();
    JsonContext jc = Ebean.createJsonContext();
    return Results.ok(jc.toJsonString(user));
}

使用JsonContext之后,我仅呈现在.select()选择的所需字段。

这很简单,当您使用select("...")它总是只获得id字段(无法避免-映射是必需的)+所需字段,但是如果稍后您尝试访问的字段不可用first select("...") -Ebean重复查询并映射整个对象。

换句话说,您正在访问第一个查询中不可用的字段,分析您的控制器和/或模板,找到所有字段并将其添加到您选择的字段中(即使它们使用通用HTML注释在视图!)

在Play Framework(2.6)的最新版本中,执行此操作的正确方法是:

   public Result list() {
        JsonContext json = ebeanServer.json();

        List<MyClass> orders= ebeanServer.find(MyClass.class).select("id,property1,property2").findList();

        return ok(json.toJson(orders));
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM