Java Hibernate映射表联接要加载的特定字段
有没有一种方法可以映射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
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