繁体   English   中英

使Hibernate忽略某些HTTP请求上的字段

[英]Make Hibernate ignore fields on certain HTTP requests

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

我知道我可以编写自己的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仅从数据库中获取firstNamelastName字段,然后使用ResultTransformer将结果映射回您的User类。 此方法不太理想,因为没有填充所有字段会造成混淆。

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

暂无
暂无

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

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