2

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

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

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

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

假设我的评论课是

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

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

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

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

4

2 回答 2

1

您必须通过comment_message_idwith连接表message_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
于 2012-05-30T11:05:51.880 回答
1

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

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

于 2012-05-31T06:44:22.450 回答