让 Hibernate 忽略某些 HTTP 请求的字段
Make Hibernate ignore fields on certain HTTP requests
我有一个 class User
定义为
@Entity
@Table(name = "users")
@JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class, property = "jsonUUID")
public class User implements Serializable, UserDetails
{
private static final long serialVersionUID = -7035881497059422985L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
protected String firstname;
protected String lastname;
protected String username;
protected ProfessionalCategory professional;
protected String companyName;
@Email
protected String email;
protected String password;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable
(
name = "role_user",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")
)
protected Set<Role> roles;
}
当我对 /users/{id}
执行 GET 请求时,我希望 Hibernate 从用户的所有字段和 return "full" 对象中获取值。但是当我在 /users/
上执行 GET 请求时,我想 return 用户列表 仅包含 firstname
和 lastname
。我不只是希望 Jackson 在序列化过程中忽略某些字段,我还希望 Hibernate 不获取它不需要的数据(因为为每个用户获取所有角色可能非常昂贵,因为我使用连接 table).
我知道我可以编写自己的 SQL 查询,但这样我就失去了使用 Hibernate 的好处。那么有没有优雅的方法来解决这个问题呢?
最优雅的解决方案是使用 Hibernate 标准并在 DAO 中指定两种不同的方法。一种方法将根据他们的 ID 获取单个用户,另一种方法将获取所有用户的列表,其中仅使用 ProjectionList
.
填充名字和姓氏
public List<User> getAllUsers() {
Criteria query = sessionFactory.getCurrentSession().createCriteria(User.class);
query.setProjection(Projections.projectionList()
.add(Projections.property("firstName"), "firstName")
.add(Projections.property("lastName"), "lastName"))
.setResultTransformer(Transformers.aliasToBean(User.class));
return query.list();
}
上面的代码导致 Hibernate 只从数据库中获取 firstName
和 lastName
字段,然后使用ResultTransformer
。这种方法不太理想,因为所有字段都没有填充会让人感到困惑。
理想的解决方案是延迟加载您的角色集合,以便 Hibernate 仅在请求时加载它。有关如何设置的更多信息,请参阅我的问答 here。
我有一个 class User
定义为
@Entity
@Table(name = "users")
@JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class, property = "jsonUUID")
public class User implements Serializable, UserDetails
{
private static final long serialVersionUID = -7035881497059422985L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
protected Long id;
protected String firstname;
protected String lastname;
protected String username;
protected ProfessionalCategory professional;
protected String companyName;
@Email
protected String email;
protected String password;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable
(
name = "role_user",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")
)
protected Set<Role> roles;
}
当我对 /users/{id}
执行 GET 请求时,我希望 Hibernate 从用户的所有字段和 return "full" 对象中获取值。但是当我在 /users/
上执行 GET 请求时,我想 return 用户列表 仅包含 firstname
和 lastname
。我不只是希望 Jackson 在序列化过程中忽略某些字段,我还希望 Hibernate 不获取它不需要的数据(因为为每个用户获取所有角色可能非常昂贵,因为我使用连接 table).
我知道我可以编写自己的 SQL 查询,但这样我就失去了使用 Hibernate 的好处。那么有没有优雅的方法来解决这个问题呢?
最优雅的解决方案是使用 Hibernate 标准并在 DAO 中指定两种不同的方法。一种方法将根据他们的 ID 获取单个用户,另一种方法将获取所有用户的列表,其中仅使用 ProjectionList
.
public List<User> getAllUsers() {
Criteria query = sessionFactory.getCurrentSession().createCriteria(User.class);
query.setProjection(Projections.projectionList()
.add(Projections.property("firstName"), "firstName")
.add(Projections.property("lastName"), "lastName"))
.setResultTransformer(Transformers.aliasToBean(User.class));
return query.list();
}
上面的代码导致 Hibernate 只从数据库中获取 firstName
和 lastName
字段,然后使用ResultTransformer
。这种方法不太理想,因为所有字段都没有填充会让人感到困惑。
理想的解决方案是延迟加载您的角色集合,以便 Hibernate 仅在请求时加载它。有关如何设置的更多信息,请参阅我的问答 here。