Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在hibernate 4上,如何获取来自select语句的实体的一个字段?_Java_Mysql_Sql_Hibernate_Hibernate 4.x - Fatal编程技术网

Java 在hibernate 4上,如何获取来自select语句的实体的一个字段?

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 {

我正在开发一个应用程序,其中有用户具有常规字段,如userId、name等,此外,用户还具有分数和排名。排名是根据用户的分数根据请求计算的。它实际上是用户在整个系统中的排名,用户得分最高的排名是1

我正在使用Hibernate4进行orm和mysql 5.1。。。对于db; 我的用户类如下所示,正如我前面所说,rank不是db中的一列

@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的解决方案。)