使用Spring Data JPA选择一列

时间:2015-03-07 07:14:17

标签: spring spring-boot spring-data-jpa spring-data-rest

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

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

    @Query("SELECT u.userName  FROM Users u")
    public List<String> getUserName();
}

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

5 个答案:

答案 0 :(得分:5)

创建一个投影界面

public interface UserNameOnly {
    String getUserName();
}

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

public interface UserRepository<User> extends JpaRepository<User,String> {
    List<UsernameOnly> findNamesByUserNameNotNull();
}

投影接口中的get方法必须与JPA存储库(在这种情况下为User)上已定义类型的get方法匹配。 “ findBySomePropertyOnTheObjectThatIsNotNull”允许您基于某些条件获取实体列表(与Iterable相对),对于findAll来说,只要唯一标识符(或任何其他NonNull字段)不为null,就可以简单地找到它。

答案 1 :(得分:2)

这适合我。

public interface UserDataRepository extends JpaRepository<UserData, Long> {

    @Query(value = "SELECT emp_name FROM user_data", nativeQuery = true)
    public List<Object[]> findEmp_name();
}


System.out.println("data"+  userDataRepository.findEmp_name());

以上一行给了我这个结果:

数据[abhijeet,abhijeet1,abhijeet2,abhijeet3,abhijeet4,abhijeet5]

答案 2 :(得分:1)

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

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

  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);
    }
    
  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
    }
    

答案 3 :(得分:0)

如果您只想返回一个列,您应该查看Projections and Excerpts,这样您就可以过滤特定列和其他有用的列。

答案 4 :(得分:-1)

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