Ebean 和 Play!不使用 .select() 过滤列
Ebean and Play! not filtering columns with .select()
我正在尝试使用 Ebean in Play! 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 的事实后,我找到了(在 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 重复查询并映射整个对象。
换句话说,您正在某处访问第一个查询中不可用的字段,分析您的控制器 and/or 模板,找到所有字段并将其添加到您的 select(即使即他们在视图中使用常见的 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));
}
我正在尝试使用 Ebean in Play! 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 的事实后,我找到了(在 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 重复查询并映射整个对象。
换句话说,您正在某处访问第一个查询中不可用的字段,分析您的控制器 and/or 模板,找到所有字段并将其添加到您的 select(即使即他们在视图中使用常见的 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));
}