我有几个具有瞬态属性的实体,我想从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 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 anotation并将其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]的属性[property]的列名
我做错了什么?
瞬态属性可能不适合我想做的事情。我需要弄清楚的是如何将这些派生列映射到我可以返回到前端的对象。如何设置一个hibernate可以将这些别名列映射到属性的对象?
答案 0 :(得分:2)
Hibernate永远不会填充瞬态字段,最重要的瞬态字段甚至不是java序列化过程的一部分。如果你真的需要这个我会尝试的是ResultTransformer.alliasToBean
它是用反射将值“注入”类中。
setResultTransformer(Transformers.aliasToBean(Yourclass.class));
只是一个简单的想法,不确定它是否会起作用。
答案 1 :(得分:2)
我明白了。您可以设置瞬态属性,虽然这很痛苦。
使用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));
其中Object是我想要使用的类,它声明了所有这些属性。