使用 Spring Data JPA 选择一列

Posted

技术标签:

【中文标题】使用 Spring Data JPA 选择一列【英文标题】:Select one column using Spring Data JPA 【发布时间】:2015-05-08 20:42:40 【问题描述】:

有人知道如何使用 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!"

【问题讨论】:

这适用于我的 JpaRepository。 【参考方案1】:

创建投影界面

public interface UserNameOnly 
    String getUserName();

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

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

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

【讨论】:

@Alax 你会考虑接受我的回答吗? 这不是解决方案,无论如何投影都会选择所有字段。 我想詹姆斯忘记在UserRepository 接口中添加@Query。我已经编辑了@James 代码。希望这只会返回用户名。 不,我没有。查询注释不是必需的,因为 Spring Data JPA 可以解析方法名称以确定要运行的查询。【参考方案2】:

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

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

    存储库实现:

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

    在控制器中

    @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
    
    

【讨论】:

这是@Query(value = "select new com.org.User(usr.userId) from User usr where usr.name(:name))") 部分的额外括号吗? @AzySır 删除了它。谢谢。【参考方案3】:

这对我有用。

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]

【讨论】:

这似乎不适用于自定义对象。如果你看到你有 Object[] 我有一个自定义对象但它没有工作。【参考方案4】:

如果您只想返回一个列,您应该查看Projections and Excerpts,这将允许您过滤特定的列和其他有用的东西。

【讨论】:

【参考方案5】:

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

【讨论】:

非常感谢您的回答。实际上,它仍然不起作用。我得到了同样的错误。如果要列出所有列,它可以工作,但如果只是其中的一部分,则不行。

以上是关于使用 Spring Data JPA 选择一列的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA 查询从一个连接表中选择所有值

Spring Data Jpa:保存方法仅返回选择,但不执行插入

如何使用 Spring Data Jpa 启用多租户

仅从 Spring Data JPA 中的联接表(多对多)中选择特定列

如何禁用嵌入式数据库 Spring-boot spring-data-jpa

为什么Spring-Data-JPA Async无法正常工作?