Java 在hibernate 4上,如何获取来自select语句的实体的一个字段?
我正在开发一个应用程序,其中有用户具有常规字段,如userId、name等,此外,用户还具有分数和排名。排名是根据用户的分数根据请求计算的。它实际上是用户在整个系统中的排名,用户得分最高的排名是1 我正在使用Hibernate4进行orm和mysql 5.1。。。对于db; 我的用户类如下所示,正如我前面所说,rank不是db中的一列Java 在hibernate 4上,如何获取来自select语句的实体的一个字段?,java,mysql,sql,hibernate,hibernate-4.x,Java,Mysql,Sql,Hibernate,Hibernate 4.x,我正在开发一个应用程序,其中有用户具有常规字段,如userId、name等,此外,用户还具有分数和排名。排名是根据用户的分数根据请求计算的。它实际上是用户在整个系统中的排名,用户得分最高的排名是1 我正在使用Hibernate4进行orm和mysql 5.1。。。对于db; 我的用户类如下所示,正如我前面所说,rank不是db中的一列 @Entity @Table(name = "users") public class User implements Serializable {
@Entity
@Table(name = "users")
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(insertable = false, updatable = false)
Integer userId;
@Column
String name;
@Column
Integer score;
Integer rank; // rank is calculated according to score
...
下面是用于检索用户顺序的sql语句
SELECT COUNT( score ) + 1 as rank
FROM users
WHERE users.score > ( SELECT users.score
FROM users WHERE `users`.`userId` = :uid)
我也可以使用存储数据库函数或过程
是否可以在每个请求上检索用户的排名,就像它是嵌套的一样,以及用户实体的其他属性
使用注释的解决方案非常可取。我相信您想要的是研究
@公式注释。它只是将您作为该列的select子句的一部分放入其中的任何片段,并使该属性为只读。(@ColumnTransformer
除了支持双向功能外,其他想法都是一样的。)
类似于以下的方法应该可以工作:
@Formula("(SELECT COUNT( score ) + 1 FROM users u WHERE u.score > ( SELECT score FROM users u2 WHERE u2.userId = id))")
Integer rank;
注意:id不合格,hibernate将为用户类的表生成别名前缀
这不是Hibernate的一个特别完善的特性。但请参见:-5.1.4.1.5。公式
你可以看看
你也可以用正常的方式让它变得懒惰
备选方案
您还可以创建一个用户视图,其中嵌入了此sql。在某些情况下,这可能很有价值,但会使您的实体成为只读的。(有些数据库确实支持针对视图的DML,但我不能说在这种情况下它的效果如何,您要求使用基于Hibernate的解决方案。)