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



如何调用它以及如何解决我在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、street:

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

4.)如果地址是数组,如何在嵌套列表中使用:

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

由于hibernate是一个持久性框架,并且不能保存/持久化到视图,所以这是不可能的。是的,您可以创建一个名称与表类似的视图,并首选该视图,但您将无法再存储到该实体中。

  1. 您可以从实体中删除getter(getSecret)。因此,数据库仍然有该字段,但您的实体不知道它。如果您尝试使用该实体存储数据,这可能会导致问题,您可能无法设置机密
  2. 您可以将getter设置为默认值(包级别访问),并密封包,以允许除密封项目之外的任何人访问getter
  3. 您可以使用spring的方法授权机制

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

public abstract PublicObject {
...
}
public OriginalObject extends PublicObject {
String secret;
}

编辑:2nd&第四个问题你可以用hql:解决

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

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

您可以将多个实体映射到同一个表,每个实体都具有要公开的属性集。看看这个问题。

最新更新