使用Spring Data JPA选择一列

Ala*_*lax 12 spring spring-data-jpa spring-data-rest spring-boot

有没有人知道如何使用Spring Data JPA获取单个列?我在Spring Boot项目中创建了一个类似下面的存储库,但{"cause":null,"message":"PersistentEntity must not be null!"}在访问Restful URL时总是会出错.

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UsersRepository extends CrudRepository<Users, Integer> {

    @Query("SELECT u.userName  FROM Users u")
    public List<String> getUserName();
}
Run Code Online (Sandbox Code Playgroud)

然后,如果我像访问Restful URL一样../users/search/getUserName,我收到错误: {"cause":null,"message":"PersistentEntity must not be null!"}

Jam*_*ron 8

创建投影接口

public interface UserNameOnly {
    String getUserName();
}
Run Code Online (Sandbox Code Playgroud)

然后在您的存储库界面中返回该类型而不是用户类型

public interface UserRepository<User> extends JpaRepository<User,String> {
    List<UsernameOnly> findNamesByUserNameNotNull();
}
Run Code Online (Sandbox Code Playgroud)

投影接口中的 get 方法必须匹配 JPA 存储库中定义类型的 get 方法,在本例中为 User。“findBySomePropertyOnTheObjectThatIsNotNull”允许您根据某些条件获取实体列表(而不是 Iterable),对于 findAll 来说,如果唯一标识符(或任何其他 NonNull 字段)不为空,则可以简单地获取实体列表。

  • @Boldbayar,你的说法不正确。对于封闭投影,接口上的方法名称与实体上的 getter 匹配...Hibernate sql 日志确认仅查询接口中存在的字段。开放投影(其中 SPEL 表达式用于计算字段值)无法优化,在这种情况下您是正确的。 (2认同)

Eth*_*raj 5

概念是:在实体类中创建一个仅包含所需即时变量的构造函数。并在如下所示的存储库方法中使用该构造函数。

假设您有一个如下所示的接口存储库

  1. 存储库实施:

    public interface UserRepository<User> extends JpaRepository<User,String>
    {
        @Query(value = "select new com.org.User(usr.userId) from User usr where usr.name(:name)")
        List<User> findUserIdAlone(@Param("name") String user);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在控制器中

    @RestController
    public class UserController 
    {
        @Autowired
        private UserRepository<User> userRepository; 
    
        @Res
        public ResponseEntity<User> getUser(@PathVariable("usrname") String userName)
        {
            User resultUser = usrRepository.findUserIdAlone(userName);
            return ResponseEntity.ok(resultUser);
        }
    }
    
    public class User 
    {
    
        private String userId,userName;
    
        public User(String userId) 
        {
            this.userId=userId;
        }
        // setter and getters goes here
    }
    
    Run Code Online (Sandbox Code Playgroud)


Mur*_*der 0

如果您需要列出所有用户,请尝试select userName from Users,如果您需要一个用户使用,"where"请查看 spring data JPA http://docs.spring.io/spring-data/jpa/docs/current/reference/html/,尝试更改 CrudRepository到 JpaRepository