Java Hibernate填充瞬态属性
我有几个实体具有临时属性,我想从sql查询中填充这些属性。我试过几种方法,但还没有找到正确的组合 下面是一个示例实体Java Hibernate填充瞬态属性,java,sql,spring,hibernate,Java,Sql,Spring,Hibernate,我有几个实体具有临时属性,我想从sql查询中填充这些属性。我试过几种方法,但还没有找到正确的组合 下面是一个示例实体 @Id @GeneratedValue(strategy=GenerationType.AUTO) long id; @Size(max=1000) String image_url; @Transient boolean liked; @Transient long numLikes; **getters and setters** for persistent prop
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
long id;
@Size(max=1000)
String image_url;
@Transient
boolean liked;
@Transient
long numLikes;
**getters and setters** for persistent properties
public boolean isLiked() {
return liked;
}
public void setLiked(boolean liked) {
this.liked = liked;
}
public long getNumLikes() {
return numLikes;
}
public void setNumLikes(long numLikes) {
this.numLikes = numLikes;
}
我已经尝试使用@Basic anotion并将其fetch方法设置为eager
@Basic(fetch = FetchType.EAGER)
但这似乎没有任何作用。我也看到它设置为懒惰
我是否遗漏了任何可能导致列名无法映射到这些临时属性之一的内容
这是我的impl代码
SQLQuery query = getCurrentSession().createSQLQuery("" +
"SELECT * ,count(likes1.liked) as numLikes " +
"FROM aboutme " +
"left JOIN " +
"(" +
" select liked, likedObject_id " +
" from likes " +
" where liked = 1" +
") as likes1 ON aboutme.id = likes1.likedObject_id " +
"left join " +
"(" +
" select likedObject_id, liked " +
" from likes " +
" where liked = 1 and profile_id = :id" +
") as likes2 on likes2.likedObject_id = aboutme.id " +
"WHERE aboutme.profile_id = :id " +
"group by aboutme.id");
query.addEntity(AboutMe.class);
query.setParameter("id",id);
return query.list();
我试过使用
SQLQuery query = ..."Select count(value that returns properly) as {object.numLikes}..."
query.addEntity("object",Object.class),
我在这里得到一个错误,说它找不到alias[alias]的property[property]的列名
我做错了什么
瞬态特性可能不是我要做的事情。我需要弄清楚的是如何将这些派生列映射到一个可以返回到前端的对象。如何设置hibernate可以将这些别名列映射到属性的对象?hibernate永远不会填充临时字段,最重要的临时字段甚至不是java序列化过程的一部分。如果您真的需要,我会尝试使用
ResultTransformer.alliasToBean
,它通过反射将值“注入”到类中
setResultTransformer(Transformers.aliasToBean(Yourclass.class));
只是一个简单的想法,不确定它是否会工作。Hibernate永远不会填充您的临时字段,最重要的临时字段甚至不是java序列化过程的一部分。如果您真的需要,我会尝试使用
ResultTransformer.alliasToBean
,它通过反射将值“注入”到类中
setResultTransformer(Transformers.aliasToBean(Yourclass.class));
只是一个简单的想法,不确定它是否有效。我想出来了。您可以设置transient属性,尽管这有点麻烦 使用SQLQuery对象上的addScalar方法,可以设置瞬态属性。但是,如果这样做,则必须以这种方式设置对象中的所有属性(Hibernate不会自动填充任何属性) 此外,还必须在SQLQuery对象上使用setResultTransformer方法。因此,为了结束我前面的示例,我必须在impl中添加以下代码
// query.addEntity(AboutMe.class); <- this contradicts the setResultTransformer
query.setParameter("id",id);
query.addScalar("id",StandardBasicTypes.LONG);
query.addScalar("image_url",StandardBasicTypes.LONG);
query.addScalar("liked",StandardBasicTypes.LONG);
query.addScalar("numLikes",StandardBasicTypes.LONG);
query.setResultTransformer(Transformers.aliasToBean(Object.class));
//query.addEntity(AboutMe.class) 我想出来了。您可以设置transient属性,尽管这有点麻烦
使用SQLQuery对象上的addScalar方法,可以设置瞬态属性。但是,如果这样做,则必须以这种方式设置对象中的所有属性(Hibernate不会自动填充任何属性)
此外,还必须在SQLQuery对象上使用setResultTransformer方法。因此,为了结束我前面的示例,我必须在impl中添加以下代码
// query.addEntity(AboutMe.class); <- this contradicts the setResultTransformer
query.setParameter("id",id);
query.addScalar("id",StandardBasicTypes.LONG);
query.addScalar("image_url",StandardBasicTypes.LONG);
query.addScalar("liked",StandardBasicTypes.LONG);
query.addScalar("numLikes",StandardBasicTypes.LONG);
query.setResultTransformer(Transformers.aliasToBean(Object.class));
//query.addEntity(AboutMe.class);Transient标记为不应参与数据库持久性的字段/方法。它们不是持久的。你为什么需要这样注释这些字段,原因是什么?好吧,也许瞬态属性不是我需要的路线。我有一对多的关系。至于喜欢的部分。也许我应该返回列表中的两个对象并以这种方式运行它?是否有方法返回不属于表实体的派生属性?您是如何做到/看到这一点的?Transient标记了不应参与数据库持久化的字段/方法。它们不是持久的。你为什么需要这样注释这些字段,原因是什么?好吧,也许瞬态属性不是我需要的路线。我有一对多的关系。至于喜欢的部分。也许我应该返回列表中的两个对象并以这种方式运行它?是否有方法返回不属于表实体的派生属性?你是怎么做到的/看到的?同样值得注意的是,如果你走这条路线,类甚至不需要是一个实体(可以说asker的类不是,因为它实际上似乎没有映射到一个表),这个类确实映射到一个表。但我想弄明白的是,如何使带有额外派生字段的表映射到一个我可以返回到前端的对象。同样值得注意的是,如果你这样做,类甚至不需要是一个实体(可以说asker的类不是,因为它实际上似乎不映射到表)此类不会映射到表。但我想弄明白的是,如何使带有额外派生字段的表映射到一个我可以返回到前端的对象。我觉得你在试图使你的项目变得非常复杂,这是不必要的。也许你应该看看你的数据模型,或者看看一些例子,看看如何把事情做得更好。对我来说,你似乎正试图摆脱冬眠的本意。也许让我重新表述一下这个问题:如何将不在同一个表中持久化的派生数据放入一个对象并返回它。到目前为止,这是我看到的唯一的方法。或者加入一个pojo,但这是相同的过程。我觉得你在试图让你的项目变得非常复杂,这是不必要的。也许你应该看看你的数据模型,或者看看一些例子,看看如何把事情做得更好。对我来说,你似乎正试图摆脱冬眠的本意。也许让我重新表述一下这个问题:如何将不在同一个表中持久化的派生数据放入一个对象并返回它。到目前为止,这是我看到的唯一的方法。或是填充到pojo中,但这是相同的过程。