【问题标题】:How to count row table in JPA Query如何在 JPA Query 中计算行表
【发布时间】:2019-06-03 19:01:24
【问题描述】:

我是 Spring Boot 的新手。我有一个 mysql 数据库,我使用查询来计算表中的行数。但它不起作用,它仍然返回我的原始表数据。你能帮我检查一下我的代码吗?

这是我的实体:

@Entity
@Table(name = "act_id_membership", schema = "activiti", catalog = "")
@IdClass(ActIdMembershipEntityPK.class)
public class ActIdMembershipEntity {
    private String userId;
    private String groupId;

    @Id
    @Column(name = "USER_ID_")
    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    @Id
    @Column(name = "GROUP_ID_")
    public String getGroupId() {
        return groupId;
    }

    public void setGroupId(String groupId) {
        this.groupId = groupId;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        ActIdMembershipEntity that = (ActIdMembershipEntity) o;
        return Objects.equals(userId, that.userId) &&
                Objects.equals(groupId, that.groupId);
    }

    @Override
    public int hashCode() {
        return Objects.hash(userId, groupId);
    }
}

这是我的查询:

@Repository
public interface MemershipRepository extends JpaRepository<ActIdMembershipEntity, String> {
    @Query ("select new com.example.activiti_restful.dtos.UserMembership(i.userId, count(i)) from ActIdMembershipEntity i where i.userId ='kermit'")
    UserMembership countMemberships(String userId);
}

更新代码: 我的服务等级:

@Service
public class MembershipService {
@Autowired
private MemershipRepository repository;

public long count() {
    return repository.count();
}

我的资源类:

@RestController
public class MembershipResource {
@Autowired
private MembershipService membershipService;

@GetMapping("/membership")
public long list() {return membershipService.count();}
}

我的自定义 JSON 对象类:

public class UserMembership {
    private String userId;

    private long numberOfusers;

    public UserMembership(String userId, long numberOfusers) {
        this.userId = userId;
        this.numberOfusers = numberOfusers;
    }
} 

MySQL 表: act_id_membership

【问题讨论】:

  • 查询“选择计数...”返回一个数字而不是列表
  • 我尝试使用以下答案修复我的代码,因为这是我第一次使用 spring,所以我仍然没有解决它。我更新了我的代码。可以查一下吗?
  • 当我在 Postman 中调用我的 json 链接时,它说:"message": "[Ljava.lang.Object; cannot be cast to java.lang.Long",
  • 如果你想统计数据库中的所有行,只要使用 CrudRepository 的默认函数,这意味着你不需要在 MemershipRepository 上写任何东西,只需调用“count()”函数。如果要统计特定条件的行,可以试试:"select count(i) from ActIdMembershipEntity i where i.userId = 'kermit'")
  • 好的,我明白了。实际上我希望它返回一个像 [{ name: kermit, value:6}] 这样的 json 格式。现在它只返回一个数字 6。我怎么能这样做?谢谢!

标签: mysql spring-boot spring-data-jpa jpql


【解决方案1】:

根据repositories documentation 使用CrudRepository 提供了一个名为count() 的方法,它是实现JpaRepositorySuperinterfaces 之一。

基于CrudRepository documentation 说:

长计数();返回实体的数量。

那么你应该使用CrudRepository 方法。除了Remove Uppercase MembershipREPOSITORY, by java code convention,你必须按照如下方式使用MembershipRepository。

 @Repository
 public interface MembershipRepository extends JpaRepository <ActIdMembershipEntity, String> {
 }

并在您的服务中使用它:

 @Service
 public class MembershipService {

     @Autowired
     private MembershipRepository repo;

     public long count() {
         return repo.count();
     }
 }

更新

根据您的要求: 在控制器中:

@RestController
public class MembershipResource {

    @Autowired
    private MembershipService membershipService;

    @GetMapping("/membership")
    public List<Object> list() { return membershipService.countMemberships();
    }
}

服务中:

@Service
public class MembershipService {

    @Autowired
    private MemershipRepository repository;

    public List<Object> countMemberships() {
        return repository.countMemberships();
    }

}

在存储库中:

@Repository
public interface MemershipRepository extends JpaRepository<ActIdMembershipEntity, String> {
    @Query ("select i.userId, count(i) from ActIdMembershipEntity i where i.userId ='kermit'")
    List<Object> countMemberships();
}

【讨论】:

  • 对不起,因为我第一次使用 Spring,我尝试按照你说的那样修复我的代码,但它仍然无法正常工作。我更新了我的代码。可以查一下吗?
  • 当我在 Postman 中调用我的 json 链接时,它说:"message": "[Ljava.lang.Object; cannot be cast to java.lang.Long",
  • 没问题。删除行 @Query ("select i.userId, count(i) from ActIdMembershipEntity i where i.userId = 'kermit'")
  • 并保留 JpaRepository。这应该可以修复您的代码。
  • 哇!有效。非常感谢!但它只返回一个数字,如果我想编写一个查询来显示带有我的@Query 之类的计数的用户 ID,我应该怎么做?你能帮我多一点吗?
【解决方案2】:

*> 实际上我希望它返回一个像 [{ name: kermit, value:6}] 这样的 json 格式。现在它只返回一个数字 6。我怎么能这样做?谢谢!

首先,创建一个类来包装你的数据:

public class UserMembership {

 private String userId;

 private long numberOfUsers;

 public UserMembership(String userId, long numberOfUsers) {
       this.userId = userId;
       this.numerOfUsers = numberOfUsers;     
 }

}

然后

@Repository 
public interface MembershipRepository extends JpaRepository <ActIdMembershipEntity, String> {
     @Query ("select new *****.UserMembership(i.userId, count(i)) from ActIdMembershipEntity i where i.userId = :userId")
     UserMembership countMemberships(String userId);
}

*****:你的完整包名

希望对您有所帮助!

【讨论】:

  • 感谢您的帮助!但它在日志中出现错误:Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate class [UserMembership]
  • select new *****.UserMembership(i.userId, ... 在 "****" 处添加您的完整包名
  • 我很抱歉让您烦恼,但它仍然只返回一个数字:(
  • 在调用 countMemberships 后显示您的代码和返回值
  • 感谢您的帮助!我更新了这篇文章中的所有代码和一张桌子的图片。当我调用 Postman 时,它只返回一个数字 13(实际上应该是 6)
猜你喜欢
  • 2019-01-27
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 2012-02-21
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多