我试图找到实现计算属性的最佳方法,该属性将最新消息查询到聊天实体中。
根据消息的类型(图像、文本、Url ...),消息实体被实现为类层次结构
@Entity
@Table(name = MessageEntity.TABLE_NAME)
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "Type", discriminatorType = DiscriminatorType.STRING)
@NamedEntityGraphs({
@NamedEntityGraph(name = MessageEntity.GRAPH_MESSAGES_FULL, attributeNodes = {
@NamedAttributeNode(value = "creator", subgraph = UserEntity.GRAPH_USER_BASIC),
@NamedAttributeNode(value = "chat")
})
})
@Getter
@Setter
public abstract class MessageEntity extends AbstractEntity
MessageImageEntity示例
@Entity
@Table(name = MessageImageEntity.TABLE_NAME)
@DiscriminatorValue("IMAGE")
@Data
@Builder
@EqualsAndHashCode(callSuper = false)
@AllArgsConstructor
@NoArgsConstructor
public class MessageImageEntity extends MessageEntity
因此,我为get last message into the Chat实现了下面的JoinFormula属性,但是get的消息实体不属于特定的实现
@ManyToOne(fetch = FetchType.LAZY)
@JoinFormula("("
+ "SELECT M.Messages_id "
+ "FROM Messages M "
+ "LEFT OUTER JOIN Messages_Image MI ON M.Messages_id = MI.Messages_id "
+ "LEFT OUTER JOIN Messages_Text MT ON M.Messages_id = MT.Messages_id "
+ "LEFT OUTER JOIN Messages_Url MU ON M.Messages_id = MU.Messages_id "
+ "WHERE M.Chat_id = Chats_id "
+ "ORDER BY M.Created_at DESC "
+ "LIMIT 1"
+ ")")
protected MessageEntity lastMessage;
有人知道我该怎么做这个查询吗?谢谢,问候
发布于 2020-08-03 17:30:26
我想说最好的方法是使用DTO,这是Blaze-Persistence Entity Views的一个完美用例。
Blaze-Persistence是JPA之上的查询构建器,它支持JPA模型之上的许多高级DBMS特性。我在其上创建了实体视图,以便在JPA模型和自定义接口定义的模型之间轻松映射,这有点像Spring数据投影。其思想是以您喜欢的方式定义目标结构,并通过JPQL表达式将属性(Getter)映射到实体模型。由于属性名用作默认映射,因此您通常不需要显式映射,因为80%的用例将具有作为实体模型子集的DTO。
模型的DTO映射可能看起来像下面这样简单
@EntityView(MessageEntity.class)
interface MessageEntityDto {
Integer getId();
// Other fields
}
@EntityView(Chat.class)
interface ChatDto {
Integer getId();
@Limit(limit = "1", order = "created DESC")
@Mapping("messages")
MessageEntityDto getLatestMessage();
}
查询就是将实体视图应用于查询,最简单的就是通过id进行查询。
ChatDto dto = entityViewManager.find(entityManager, ChatDto.class, id);
但是Spring数据集成允许您像使用Spring数据投影一样使用它:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#spring-data-features
它将只获取您告诉它获取的映射
https://stackoverflow.com/questions/63215408
复制相似问题