Spring Data Rest和count查询

时间:2018-05-09 16:28:28

标签: java spring spring-data-rest

我正在使用Spring Data Rest试验几行代码。我找不到任何通过REST发送一个简单的请求来计算特定实体的所有记录。

假设我有以下实体:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Person {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String firstName;
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

应使用以下存储库访问:

import java.util.List;

import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {
}

有没有办法知道REST在我的数据库中保存了多少Person个实体,没有指定条件?

3 个答案:

答案 0 :(得分:3)

另一种选择是引入自定义查询方法。这些方法通过REST数据存储库公开。

例如,使用JPA:

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {
    @Query("select count(p) from Person p")
    Long findCount();
}

使用MongoDB:

@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends MongoRepository<Person, Long> {
    @Query(value = "{}", count = true)
    Long findCount();
}

然后从休息中调用它,它只是/people/search/findCount,它只返回正文中没有额外属性的数字,例如:

200 success

date: Wed, 09 May 2018 17:59:13 GMT
transfer-encoding: chunked
content-type: application/hal+json;charset=UTF-8

154

无需解析GET响应并不必要地获取记录。

答案 1 :(得分:2)

Spring Data REST serves只有标准的HTTP方法,如GET,POST,PUT,PATCH,DELETE等。

但是,如果您需要获取资源总数,例如,请发出GET请求并检查其页面阻止:

  "page" : {
    "size" : 5,
    "totalElements" : 50,
    "totalPages" : 10,
    "number" : 1 
  }

或创建custom controller

<强>已更新

对于GET method on collection resources SDR,返回包含资源元素总数的可分页结果。 SDR会触发两个选择查询:一个用于页面上的元素,另一个用于所有元素的计数查询。

答案 2 :(得分:-1)

看起来CrudRepository的count()方法是你的候选人。根据javadoc:

/**
 * Returns the number of entities available.
 * 
 * @return the number of entities
 */
long count();