我必须mysql表票证是父和用户是子,在一个多对一的关系。
=TICKET=
PK(ID)
summary
message
FK(user_id) references USER(user_id)
=USER=
PK(ID)
email
password
以及jpa实体
@Entity
class TICKET {
@Id
private Integer ID;
private String summary;
private String message;
@ManyToOne
@JoinColumn(name="user")
private USER user;
}
@Entity
class USER {
@Id
private Integer ID;
private String email;
private String password;
}
如果我通过id查询到一张票,它也会返回不好的用户信息(user.id,user.email,user.password)。
ticketsCrudRepository.findById(ticketId);
我想要的是一张这样的table:
TICKET.ID | summary | message | USER.email
我知道如何在mysql中实现它,但是jpa对我来说太多了。我不想使用jpql或本机查询语言。有什么建议吗?
3条答案
按热度按时间brtdzjyr1#
使用spring数据投影是一种选择,但您会在某个时候遇到它的局限性。如果达到这一点,就可以查看blaze持久性实体视图。
我创建了这个库,以便在jpa模型和自定义接口或抽象类定义的模型之间进行简单的Map,比如spring数据在steroids上的投影。其思想是以您喜欢的方式定义目标结构(域模型),并通过jpql表达式将属性(getter)Map到实体模型。
对于blaze持久性实体视图,用例的dto模型可以如下所示:
或者更简单
查询是将实体视图应用于查询的问题,最简单的就是按id进行查询。
TicketDto a = entityViewManager.find(entityManager, TicketDto.class, id);
spring数据集成允许您像spring数据投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_us/index.html#spring-数据特征xzv2uavs2#
当你拿到一张票的时候,你也会得到一个用户
@ManyToOne
默认情况下FetchType.EAGER
. 你可以通过把涂鸦改成@ManyToOne(fetch = FetchType.LAZY)
做搜索你可以试试返回的列表将包含4个字段(t.id、t.summary、t.message、u.email)的数组。
如果你觉得这个有用,请告诉我。
:)
0dxa2lsx3#
我正在寻找的解决方案是spring数据jpa投影。它们可以是接口或类,其getter与要从数据库中获取的列相匹配。有关详细信息,请查看此处的spring框架文档。