如何使用@Query注释

时间:2017-07-31 00:02:03

标签: spring-data-jpa

这是数据库中的行。

group userid
1    a
2    b
1    c
3    d

我想使用@query注释查询

@Query(value ="SELECT *, count(*) as cnt FROM user group by body order by cnt DESC", nativeQuery = true)
List<User> getGroupRanking();

并且,我希望得到结果

group cnt
1     2
2     1
3     d

List<User>收集不接受“cnt&#39;属性是别名。 另一个不接受的理由,用户定义的课程不包含&#39; cnt&#39;属性。我被定义为&#39; cnt&#39;用户类中的属性,如下面的代码。

public class User{
 @Column(name ="group")
 private String group;
 ..

 private Integer cnt;
 public Integer getCnt(){ return cnt; }
 public void setCnt(Integer cnt){ this.cnt = cnt; }

}

虽然我会阻止更新架构,但上面的代码更新了架构。因为

appConfig.xml配置设置如下

<prop key="hibernate.hbm2ddl.auto">update</prop>    

我不想更新架构,我想在使用@Query注释时通过User Class(bean)在JSP文件中显示cnt属性。如何接受&#39; cnt&#39;使用没有更新架构的User类的属性? &#39;如&#39;关键字使用情况不详细(link

1 个答案:

答案 0 :(得分:1)

很难理解你需要什么,但我会尝试......))

首先创建一个投影:

public interface UserCount {
     User getUser();
     long getUserCount();
}

然后创建一个存储库查询方法,返回此预测:

public interface UserRepo extends JpaRepository<User, Long> {

    @Query("select u as user, count(u) as userCount from User u group by u order by userCount desc")
    List<UserCount> getUserCounts();
}

然后,您可以获取UserCount投影列表并将其发送到JSP视图。

补充阅读:

更新

<强>控制器

@Controller
public class UserController {

    @Autoware
    private UserRepo repo;

    @GetMapping("/")
    public String withCount(Model model) {

        List<UserCount> userCounts = getUserCounts();
        model.addAttribute("userCounts", userCounts);

        return "userCounts";
    }
}

<强> JSP

<table>
  ...
  <c:forEach items="${userCounts}" var="item">
    <tr>
      <td>${item.user.group}</td>
      ...
      <td>${item.userCount}</td>
    </tr>
  </c:forEach>
</table>

部分信息:12

我建议从 jsp 切换到thymeleaf