Hibernate - 如何加载同一对象的不同视图

时间:2017-01-18 22:48:03

标签: java hibernate orm hibernate-mapping

如何调用以及如何解决我在API上的下一个问题。我必须返回具有不同视图的同一对象。某些数据不应返回给用户。这是一个例子: 父:

public class OrginalObject{
    private int id;
    private String name;
    private String surname;
    private int age;
    private String school;
    private String secret;
    private Address Address;

子:

public class Address{
    private int id;
    private String street;
    private String zipCode;
    private String Country;

如果我想加载完整对象列表,我会打电话:

session.createCriteria(OrginalObject.class).list();

1。)但如果不想让别人知道我的财产秘密,我需要隐藏它。但我不知道如何从数据库中调用它所拥有的所有其他属性。类似的东西:

session.createCriteria(OrginalObjectPublic.class).list();

2。)另外我想选择只加载“重要”数据。这仅表示属性id, name, school

session.createCriteria(OrginalObjectImportant.class).list();

有没有办法做一个适配器/“自定义视图”直接从数据库加载它?我知道我可以编写纯sql,但我想在具有20多个具有嵌套列表/对象的属性的对象上使用它。

3。)此外,如何使用此转换仅加载嵌套对象的少数属性与原始对象的属性。示例json(仅来自OrginalOBject的id,name,school和来自Address:

的街道
{
    "id": 1,
    "name": "testname",
    "school": "testschool",
    "Address": {
    {
        "id": 33,
        "street": "testStreet 33"
    }
}

4。)如果Address是数组,还可以在嵌套列表中使用它:

public class OrginalObject{
    ...
    private List<Address> AddressList;

3 个答案:

答案 0 :(得分:1)

由于hibernate是一个持久性框架,你不能保存/持久化到视图,这是不可能的。是的,你可以创建一个像表一样的名称的视图,而不喜欢视图,但你将无法再存储到该实体。

  1. 您可以从实体中删除getter(getSecret)。因此数据库仍然具有该字段,但您的实体不知道它。如果您尝试使用该实体存储数据,这可能会导致问题,您可能无法设置密码。
  2. 你可以使getter默认(包级访问)并密封包,让密封项目之外的任何人都不会访问getter。
  3. 您可以使用spring's method authorization mechanism

答案 1 :(得分:1)

首先没有人可以访问你的秘密, 只有你应该看到它的程序员。 第二,如果没有人应该拥有它为什么存储它。 如果你想把它拉出来,你可以使用继承。

之类的东西
public abstract PublicObject {
    ...
}

public OriginalObject extends PublicObject {
    String secret;
}

编辑: 第二&amp;你可以用hql解决它们的第四个问题:

String hql = "SELECT O.id, O.name, O.school FROM OrginalObject O";
Query query = session.createQuery(hql);
List results = query.list();

至于你的第3个问题,这取决于你的api。例如,如果您使用杰克逊,可以使用@JsonIgnore

答案 2 :(得分:1)

您可以将多个实体映射到同一个表,每个实体都包含您要公开的属性集。 看看this question.