我的数据库中有两个实体对象:UserEntity和ItemEntity,它们与OneToMany关系映射。 这是我的代码:
UserEntity:
@Entity
@Table(name = "users")
public class UserEntity {
@Id
@Column(name = "user_id")
@GeneratedValue
public int user_id;
@Column(name = "userlogin")
public String userlogin;
@Column(name = "userpass")
public String userpass;
@Column(name = "name")
public String name;
@Column(name = "email")
public String email;
....
@JsonBackReference
@OneToMany(mappedBy="user", cascade = { CascadeType.MERGE },fetch=FetchType.EAGER)
private List<ItemEntity> items;
ItemEntity:
@Entity
@Table(name = "items")
public class ItemEntity {
@Id
@Column(name = "id")
@GeneratedValue
private int id;
@Column(name = "title")
public String title;
@Column(name = "info")
public String info;
@JsonManagedReference
@ManyToOne
@JoinColumn(name="user_id")
private UserEntity user;
现在我尝试使用拥有当前项目的用户的特定字段从我的数据库中读取我的所有项目。我只需要UserEntity名称和电子邮件。
此代码:
Query query = this.sessionFactory.getCurrentSession().createQuery("from ItemEntity WHERE title = :title");
还会返回UserEntity中的所有字段,因为它已映射,但我不想这样,因为我将这些数据作为JSON发送,并且有人可以看到有关拥有该用户的所有信息某些开发工具(如Chrome)中的项目(如用户登录名和密码)。 怎么做到?
答案 0 :(得分:0)
我建议您使用DTO。
将您的实体转换为DTO,然后将DTO对象转换为 json字符串。 在DTO中仅填充您想要作为响应的一部分的字段。 这将使您的设计更加干净。
答案 1 :(得分:0)
除了jitsonfire建议的内容之外,你还可以写一个这样的查询
select name, email from ItemEntity WHERE title = :title
比得到你的结果
List<Object[]> result = query.list();
对象数组将包含您的列,列表元素将等于行,因此您可以执行类似
的操作for (Object[] tuple : result) {
tuple[0]; //name
tuple[1]; // email
}