【问题标题】:Hibernate mapping a specific field to be loaded by a table joinHibernate 映射要由表连接加载的特定字段
【发布时间】:2024-04-30 23:30:02
【问题描述】:

有没有一种方法可以映射休眠对象中的字段以加载表查询?

例如,假设Table_Message 具有字段id(int),message_key(varchar),message_content(Clob),language(varchar)。此表将保存不同语言(区域设置)的消息。

还有另一个使用休眠映射到实体的表。 Comments 与字段 id(int),comment_message_id(varchar),created_date(datetime)comment_message_id 指的是Table_Messagemessage_key 列。

编辑:Table_Message 不是休眠中的映射实体

假设我的评论类是

public class Comment
{
   int id;
   String message;
   Date createdDate;
}

有没有办法告诉 hibernate 通过使用默认语言环境(例如“en”)通过 message_key 加入 Comment 表和 Table_Message 表来加载消息。

基本上有没有办法告诉休眠通过运行特定查询来加载字段?如果是这样,那是什么?

我知道编写用于加载实体的自定义 SQL 查询。但由于我使用的是 XDoclet,似乎没有办法做到这一点。如果有一种方法可以针对单个字段执行此操作,那将非常方便。

【问题讨论】:

  • Thihara,你找到解决办法了吗?如果是这样,你能把它分享给其他人吗?谢谢!
  • @dpelisek 太落后了。对不起,我不记得有什么用。

标签: java database hibernate orm hibernate-mapping


【解决方案1】:

我想 ResultTransformer 可以帮助你。请检查

http://docs.jboss.org/hibernate/orm/3.3/api/org/hibernate/transform/ResultTransformer.html http://*.com/questions/6423948/resulttransformer-in-hibernate-return-null

【讨论】:

    【解决方案2】:

    您必须通过comment_message_idmessage_key 连接表,并通过language 进一步过滤结果。我认为message_key 是独一无二的。

    附带说明:您应该使用整数键以获得更好的性能。

    您可以尝试在 SQL 中编写数据库视图并创建实体以使视图不透明:

    CREATE VIEW Comment_Table_Message AS 
    SELECT c.id, c.comment_message_id, c.created_date, m.id AS mid, 
           m.message_content, m.language 
    FROM Comment c, Table_Message m 
    WHERE c.comment_message_id = t.message_key;
    

    现在您可以创建一个实体 CommentTableMessage 并使用 JPQL 按语言过滤结果:

    SELECT x FROM CommentTableMessage x WHERE x.language=?1
    

    如果 Table_Message 是一个 Hibernate 实体,你会写(用 JPA 术语):

    @Entity
    public class Comment
    {
       int id;
       @ManyToOne()
       @JoinColumn(name="comment_message_id")
       TableMessage tableMessage;
       String message;
       Date createdDate;
    }
    
    @Entity
    public class TableMessage {
       int id;
       @Id
       String messageKey;
       bytes[] messageContent; //I don't know how you want to deal with Blobs?
       String language;
    }
    

    如果你可以编写一个简单的 JPA 查询:(你可以使用 JPA 吗? - 下一个假设)

    SELECT c FROM Comment c WHERE c.tableMessage.language=?1
    

    【讨论】:

    • 问题是TableMessage没有在hibernate中映射。所以我认为这行不通....我想我没有在问题中说清楚。我现在要编辑。
    • 我编辑了答案。新解决方案假定您有权在数据库中创建新视图。在某些情况下,程序员无法更改数据库结构(例如,在程序发布之前,这种更改是不允许的)
    • 是的,我也考虑过创建一个视图,但这对我不起作用。我真的在寻找我所说的特定解决方案或类似的解决方案,无需任何数据库修改。
    • 如何在未映射到任何实体的表上编写 JPA 查询?
    • 我看到你写的,但你知道你可以自动将 SQL NativeQuery 结果映射到实体吗?