使用Spring数据JPA选择一列

使用Spring数据JPA选择一列,spring,spring-boot,spring-data-jpa,spring-data-rest,Spring,Spring Boot,Spring Data Jpa,Spring Data Rest,有人知道如何使用SpringDataJPA获取单个列吗?我在我的Spring Boot项目中创建了一个存储库,如下所示,但在访问Restful URL时总是出现{“cause”:null,“message”:“PersistentEntity不得为null!”}错误 @RepositoryRestResource(collectionResourceRel = "users", path = "users") public interface UsersRepository extends Cr

有人知道如何使用SpringDataJPA获取单个列吗?我在我的Spring Boot项目中创建了一个存储库,如下所示,但在访问Restful URL时总是出现
{“cause”:null,“message”:“PersistentEntity不得为null!”}
错误

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

    @Query("SELECT u.userName  FROM Users u")
    public List<String> getUserName();
}
@RepositoryRestResource(collectionResourceRel=“users”,path=“users”)
公共接口UsersRepository扩展了Crudepository{
@查询(“从用户u中选择u.userName”)
公共列表getUserName();
}
然后,如果访问Restful URL,如
。/users/search/getUserName
,则会出现错误:
{“cause”:null,“message:“persistenententity不能为null!”

如果需要列出所有用户,请尝试
从用户中选择用户名
,如果需要一个用户使用
“where”
查看spring数据JPA,尝试将crudepository更改为JpaRepository

如果您只想返回一个列,您应该查看该列,它将允许您筛选特定的列和其他有用的内容。

这对我很有用

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());
公共接口UserDataRepository扩展了JpaRepository{
@查询(value=“从用户数据中选择emp\U名称”,nativeQuery=true)
公共列表findEmp_name();
}
System.out.println(“数据”+userDataRepository.findEmp_name());
上面这行给了我这个结果:


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

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

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

  • 存储库实现:

    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);
    }
    
    public interface UserRepository扩展了JpaRepository
    {
    @查询(value=“从用户usr中选择新的com.org.User(usr.userId),其中usr.name(:name)”)
    列出findUserIdAlone(@Param(“name”)字符串用户);
    }
    
  • 内部控制器

    @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
    }
    
    @RestController
    公共类用户控制器
    {
    @自动连线
    私有用户存储库用户存储库;
    @Res
    公共响应属性getUser(@PathVariable(“usrname”)字符串用户名)
    {
    User resultUser=usrRepository.findUserIdAlone(用户名);
    返回ResponseEntity.ok(resultUser);
    }
    }
    公共类用户
    {
    私有字符串userId,userName;
    公共用户(字符串用户ID)
    {
    this.userId=userId;
    }
    //塞特和盖特在这里
    }
    

  • 创建投影界面

    public interface UserNameOnly {
        String getUserName();
    }
    
    然后在存储库界面中返回该类型,而不是用户类型

    public interface UserRepository<User> extends JpaRepository<User,String> {
        List<UsernameOnly> findNamesByUserNameNotNull();
    }
    
    public interface UserRepository扩展了JpaRepository{
    列出findNamesByUserNameNotNull();
    }
    
    投影界面中的get方法必须与JPA存储库中定义类型的get方法(在本例中为User)匹配。
    “FindBysomePropertyontheObjectThatNotNull”允许您根据某些条件获取实体列表(与Iterable相反),对于findAll,如果唯一标识符(或任何其他非null字段)不为null,则可以简单地获取实体列表。

    非常感谢您的回答。实际上,它仍然不起作用。我也犯了同样的错误。如果要列出所有列,它会起作用,但如果只是其中的一部分,则不起作用。这对我来说适用于JpaRepository。这是@Query(value=“select new com.org.User(usr.userId)from User usr where usr.name(:name)))部分的一个额外括号吗?@AzySır将其删除。谢谢。这似乎不适用于自定义对象。如果你看到对象在哪里[]我有一个自定义对象,它没有工作。@ Alax,你会考虑接受我的答案吗?这不是解决方案TBH,投影选择所有领域无论如何。