首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Hibernate JoinFormula注释进行多态查询?

如何使用Hibernate JoinFormula注释进行多态查询?
EN

Stack Overflow用户
提问于 2020-08-02 19:22:48
回答 1查看 181关注 0票数 0

我试图找到实现计算属性的最佳方法,该属性将最新消息查询到聊天实体中。

根据消息的类型(图像、文本、Url ...),消息实体被实现为类层次结构

代码语言:javascript
运行
复制
@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示例

代码语言:javascript
运行
复制
@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的消息实体不属于特定的实现

代码语言:javascript
运行
复制
@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;

有人知道我该怎么做这个查询吗?谢谢,问候

EN

回答 1

Stack Overflow用户

发布于 2020-08-03 17:30:26

我想说最好的方法是使用DTO,这是Blaze-Persistence Entity Views的一个完美用例。

Blaze-Persistence是JPA之上的查询构建器,它支持JPA模型之上的许多高级DBMS特性。我在其上创建了实体视图,以便在JPA模型和自定义接口定义的模型之间轻松映射,这有点像Spring数据投影。其思想是以您喜欢的方式定义目标结构,并通过JPQL表达式将属性(Getter)映射到实体模型。由于属性名用作默认映射,因此您通常不需要显式映射,因为80%的用例将具有作为实体模型子集的DTO。

模型的DTO映射可能看起来像下面这样简单

代码语言:javascript
运行
复制
@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

它将只获取您告诉它获取的映射

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63215408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档