gpt4 book ai didi

java - 伊 bean 和玩吧!不使用 .select() 过滤列

转载 作者:行者123 更新时间:2023-11-30 03:15:09 24 4
gpt4 key购买 nike

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

我有这些模型:

用户:

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

用户 token :

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

然后,我有一个 Controller 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() 时,它会过滤字段并加载部分对象,但它完全加载了它。日志中还有更多问题,我不知道为什么会发生。

Statements logs

它正在进行 3 次查询。第一个是我想要的。然后它让一个获取整个模型,另一个找到 UserTokens。我不知道为什么它要执行最后两个查询,而我只想执行第一个查询。

解决方案编辑

在接受了我必须按照 @biesior 的建议构建 Json 的事实之后,我找到了(从 nowhere 中)解决方案!

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 字段(无法避免 - 这是映射所必需的)+所需字段,但如果稍后您尝试访问第一个 select("...") 中不可用的字段 - Ebean 会重复查询并映射整个对象。

换句话说,您正在访问第一个查询中不可用的字段,分析您的 Controller 和/或模板,找到所有字段并将其添加到您的选择中(即使它们是用常见的 HTML 注释的)在 View 中发表评论!)

关于java - 伊 bean 和玩吧!不使用 .select() 过滤列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32825564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com