Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 获取相关实体作为基类型_Json_Jpa - Fatal编程技术网

Json 获取相关实体作为基类型

Json 获取相关实体作为基类型,json,jpa,Json,Jpa,我目前正在尝试设置一个数据库-仅使用Java。考虑到这个可能出现在普通社交网络应用程序中的简单类: @Entity class User { @Id private String email; private String name; private String otherInfo; @ManyToMany private List<User> contacts; } @实体 类用户{ @身份证 私人字符串电子邮件; 私有字符串名

我目前正在尝试设置一个数据库-仅使用Java。考虑到这个可能出现在普通社交网络应用程序中的简单类:

@Entity
class User {
    @Id
    private String email;
    private String name;
    private String otherInfo;

    @ManyToMany
    private List<User> contacts;
}
@实体
类用户{
@身份证
私人字符串电子邮件;
私有字符串名称;
私有字符串otherInfo;
@许多
私人名单联系人;
}
当用户登录时,他应该会收到基本信息和联系人列表以及他们的基本信息,而不是他们的联系人。为了减少锅炉板代码的数量,我想使用像Gson这样的标准解决方案。但是,即使使用延迟获取,整个用户也会加载到
gson.toJson(user)


因此,我考虑将基本信息提取到一个基类
BasicUser
,并将
contacts
更改为
List
。现在,当我获取联系人时,我只需要绕过鉴别器列——当然,他们都保存为服务器上的完整用户。不幸的是,我不知道该怎么做。有什么想法吗?

如果您只需要获取实体的一部分就可以使用。例如,在您的情况下,它可以是这样的:

public interface BaseUser {
    String getEmail();
    String getName();
    String getOtherInfo();
}

public interface UserRepo extends JpaRepository <User, String> {
    List<BaseUser> findAllBy();
}
公共接口BaseUser{
字符串getEmail();
字符串getName();
字符串getOtherInfo();
}
公共接口UserRepo扩展了JpaRepository{
列出findAllBy();
}

您不应该为了容纳序列化库而修改域模型


如果您只希望集合的某些字段向JSON公开,那么可以将Jackson与
@JsonView
(参见此处:)一起使用,但不确定Gson是否提供了类似的功能,因为我从未广泛使用过它

使用Jackson进行序列化,无需编写自定义序列化代码即可解决此问题
BasicUser
包含属性的getter,我想序列化:

public interface BasicUser {
    String getEmail();
    String getFirstName();
    String getLastName();
}
通过单个注释,
contacts
属性被解释为
BasicUser
s的列表:

@Entity
public class User implements BasicUser {    
    @Id
    private String email;
    private String firstName;   
    private String lastName;

    @ManyToMany
    @JsonSerialize(contentAs = BasicUser.class)
    private List<User> contacts = new ArrayList<>();    

    // ... implemented getters
}
@实体
公共类用户实现BasicUser{
@身份证
私人字符串电子邮件;
私有字符串名;
私有字符串lastName;
@许多
@JsonSerialize(contentAs=BasicUser.class)
private List contacts=new ArrayList();
//…实现的getter
}

我同意最好将网络com的持久性和序列化分离。有了你对杰克逊的支持,我设法解决了我的问题,尽管
JsonView
?因为我无法根据实体图的深度切换视图,所以无法执行此操作。在第一层(登录用户),我想序列化
联系人
属性,但在第二层(用户的联系人)上,应该是ommitted。对不起,我刚刚意识到我链接到了错误的问题。我特别是指这种方法:。您只需跳过
JsonView
中的
User.contacts
,该联系人将被传递到
JsonSerializer
(您的问题与我链接的问题完全相同,只是
A
B
是相同的)