Java Hibernate映射表联接要加载的特定字段

Java Hibernate映射表联接要加载的特定字段,java,database,hibernate,orm,hibernate-mapping,Java,Database,Hibernate,Orm,Hibernate Mapping,有没有一种方法可以映射hibernate对象中要加载表查询的字段 例如,假设Table\u Message具有字段id(int)、Message\u key(varchar)、Message\u content(Clob)、language(varchar)。此表将保存不同语言(区域设置)的消息 以及另一个使用hibernate映射到实体的表注释带有字段id(int)、注释\u消息\u id(varchar)、创建日期(datetime)注释消息id指的是表消息的消息键列 编辑:表_消息不是hi

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

例如,假设
Table\u Message
具有字段
id(int)、Message\u key(varchar)、Message\u content(Clob)、language(varchar)
。此表将保存不同语言(区域设置)的消息

以及另一个使用hibernate映射到实体的表<代码>注释带有字段
id(int)、注释\u消息\u id(varchar)、创建日期(datetime)
<代码>注释消息id指的是
表消息
消息键

编辑:表_消息不是hibernate中的映射实体

假设我的注释类是

public class Comment
{
   int id;
   String message;
   Date createdDate;
}
有没有一种方法可以告诉hibernate通过消息键将注释表和表消息表与默认语言环境(例如“en”)连接起来来加载消息

基本上,有没有一种方法可以告诉hibernate通过运行特定的查询来加载字段?如果是这样,那是什么方式


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

您必须通过
注释\u消息\u id
消息\u键
连接表,并通过
语言
进一步过滤结果。我假设
消息\u键
是唯一的

顺便提醒一下:您应该使用整数键以获得更好的性能

您可以尝试用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

如果表_消息是一个Hibernate实体,您可以编写(用JPA术语):

有了这些,您可以编写一个简单的JPA查询:(您可以使用JPA吗?——下一个假设)


我想ResultTransformer可能会在这方面帮助您。请查收


http://stackoverflow.com/questions/6423948/resulttransformer-in-hibernate-return-null

问题是TableMessage没有在hibernate中映射。所以我认为这不管用。。。。我想我在问题中没有说清楚。我现在编辑。我编辑了答案。新解决方案假定您有权在数据库中创建新视图。在某些情况下,程序员无法更改数据库结构(例如,在程序发布之前,这种更改是不允许的)是的,我也考虑过创建一个视图,但这对我来说是行不通的。我真的在寻找一个我所说的或类似的解决方案,而不需要任何数据库修改。我怎么能在一个没有映射到任何实体的表上写一个JPA查询?我知道是你写的,但是你知道你可以自动将SQL NativeQuery结果映射到一个实体吗?Thihara,你找到解决方案了吗?如果是的话,你能和其他人分享一下吗?谢谢@德佩利塞克,太晚了。对不起,我不记得有什么用了。
@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;
}
SELECT c FROM Comment c WHERE c.tableMessage.language=?1