Hibernate映射要由表连接加载的特定字段

时间:2012-05-30 09:09:54

标签: java database hibernate orm hibernate-mapping

有没有办法可以在hibernate对象中映射一个字段来加载表查询?

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

另一个使用hibernate映射到实体的表。 Comments字段id(int),comment_message_id(varchar),created_date(datetime)comment_message_id是指Table_Message的{​​{1}}列。

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

假设我的评论课是

message_key

有没有办法告诉hibernate加载消息,方法是使用带有默认语言环境的message_key连接Comment表和Table_Message表(例如'en')。

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

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

2 个答案:

答案 0 :(得分:1)

您必须在comment_message_id之后使用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

答案 1 :(得分: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