有没有办法可以在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,似乎没有办法做到这一点。如果有一种方法可以为单个字段做到这一点,那将非常方便。
答案 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