【问题标题】:how to print an alias attribute in JSP file using @Query annotation如何使用@Query 注解在 JSP 文件中打印别名属性
【发布时间】:2017-07-31 00:02:02
【问题描述】:

这是数据库中的行。

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&lt;User&gt; 集合不接受作为别名的“cnt”属性。 另一个不接受的原因,用户定义的类不包含“cnt”属性。我在用户类中定义了'cnt'属性,如下代码。

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 注释时通过用户类(bean)在 JSP 文件中显示 cnt 属性。如何在没有更新架构的情况下使用 User 类接受“cnt”属性? 'as' 关键字用法不详(link)

【问题讨论】:

    标签: spring-data-jpa


    【解决方案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

    【讨论】:

    • 您对问题的意图给出了正确的答案。我有一个问题,如何在界面中使用getUser()和getUserCount()打印出一个jsp文件?
    • 不懂你。您如何想象使用仅适用于数据库的存储库方法打印 jsp 文件?或者你想问如何在mvc控制器中使用repo方法在jsp页面中显示其值?..
    • 感谢您的回答。我想在 jsp 文件中使用方法getUser() 和 getUserCount()。但我无法处理。我无法理解投影。以及为什么调用别名( ${item.userCount} )而不是方法名( ${item.getUserCount()} )。
    • 最重要的是,我的jsp文件发生了错误。像这样。 Servlet.service() for servlet [appServlet] in context with path [/app] threw exception [An exception occurred processing JSP page /WEB-INF/views/group.jsp at line 35 33: &lt;c:forEach items="${list}" var="item"&gt; 34: &lt;div class="b-field-tit"&gt; 35: ${item.count} 36: &lt;/div&gt; 37: &lt;/c:forEach&gt; 38: 我的数据库;是mariadb,这个语法不正确@Query("select u as user, count(u) as userCount from User u group by u 表名的别名'u'不接受在mariadb中查询语法
    • 我对这样的注释的查询,@Query(value = "select name, count(*) as userCount from User group by body order by userCount desc", nativeQuery = false) abobe 查询在 jsp 文件中工作。像这样。 ${item} 但是,结果日志没用。 [Ljava.lang.Object;@466a8d2a [Ljava.lang.Object;@720087c ...jsp 文件中的这个表达式不起作用${item.userCount}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多