【发布时间】:2014-01-15 21:08:54
【问题描述】:
我有几个具有临时属性的实体,我想从 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 注释并将其获取方法设置为渴望
@Basic(fetch = FetchType.EAGER)
在吸气剂上,但这似乎没有任何作用。我也看到它设置为懒惰。
我是否在此处遗漏了任何会导致列名未映射到这些瞬态属性之一的内容?
这是我的实现代码。
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 可以将这些别名列映射到属性?
【问题讨论】:
-
Transient 标记为永远不应参与数据库持久性的字段/方法。他们并不执着。为什么还要对这些字段进行这样的注释,原因是什么?
-
好吧,也许瞬态属性不是我需要走的路线。我有一对多的关系。对于喜欢的部分。也许我应该在列表中返回两个对象并以这种方式运行它?有没有办法返回不属于表实体的派生属性?你是怎么做的/看到这个做的?