【问题标题】:Make Hibernate ignore fields on certain HTTP requests让 Hibernate 忽略某些 HTTP 请求上的字段
【发布时间】:2015-03-26 03:27:08
【问题描述】:

我有一个类 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 从用户中的所有字段中获取值并返回“完整”对象。但是当我对/users/ 执行GET 请求时,我想返回一个仅包含firstnamelastname 的用户列表。我不仅希望 Jackson 在序列化期间忽略某些字段,我还希望 Hibernate 不获取它不需要的数据(因为获取每个用户的所有角色可能非常昂贵,因为我使用了 join表)。

我知道我可以编写自己的 SQL 查询,但是我会失去使用 Hibernate 的好处。那么有没有一种优雅的方法来解决这个问题?

【问题讨论】:

  • 你不能把你的角色设置为延迟加载吗?

标签: java sql spring hibernate orm


【解决方案1】:

最优雅的解决方案是使用 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 仅从数据库中获取 firstNamelastName 字段,然后使用 ResultTransformer 将结果映射回您的 User 类。这种方法不太理想,因为没有填充所有字段会令人困惑。

理想的解决方案是延迟加载您的角色集合,以便 Hibernate 仅在请求时加载它。有关如何设置的更多信息,请参阅我的问答here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-18
    • 2017-04-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    相关资源
    最近更新 更多