source

스프링 데이터 JPA를 사용하여 열 하나를 선택합니다.

ittop 2023. 3. 23. 23:11
반응형

스프링 데이터 JPA를 사용하여 열 하나를 선택합니다.

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

Restful URL에 접속하면../users/search/getUserName에러가 표시됩니다.{"cause":null,"message":"PersistentEntity must not be null!"}

투영 인터페이스 생성

public interface UserNameOnly {
    String getUserName();
}

그런 다음 저장소 인터페이스에서 사용자 유형 대신 해당 유형을 반환합니다.

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

투영 인터페이스의 get 메서드는 JPA 저장소에 정의된 유형의 get 메서드(이 경우 사용자)와 일치해야 합니다.'검색 기준」일부 프로퍼티온오브젝트ThatIsNotNull"을 사용하면 몇 가지 기준에 따라 (반복 가능이 아닌) 엔티티 목록을 얻을 수 있습니다.findAll의 경우 고유 식별자(또는 기타 NonNull 필드)가 null이 아닌 경우만 가능합니다.

개념: 엔티티 클래스에 필요한 인스턴트 변수만 있는 생성자를 만듭니다.그 컨스트럭터를 다음에 나타내는 저장소 메서드로 사용합니다.

다음과 같은 인터페이스 Repository가 있다고 가정합니다.

  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
    }
    

이거면 되겠네요.

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

위의 행에서 다음과 같은 결과가 나왔습니다.

data [아비지트, 아비지트1, 아비지트2, 아비지트3, 아비지트4, 아비지트5]

하나의 열만 반환하려면 Projections and Extracts(프로젝션 및 발췌)를 확인해야 합니다.이것에 의해, 특정의 열이나 그 외의 사용 빈도를 필터링 할 수 있습니다.

모든 사용자를 나열해야 할 경우select userName from Users사용자 1명이 필요한 경우"where"spring data JPA http://docs.spring.io/spring-data/jpa/docs/current/reference/html/에서 CrudRepository를 JpaRepository로 변경해 보겠습니다.

Spring Data JPA 저장소에서 메서드의 커스텀 구현을 제공하여 쿼리 및 반환 유형을 완전히 제어할 수 있습니다.접근방식은 다음과 같습니다.

  • 원하는 메서드 시그니처를 가진 인터페이스를 정의합니다.
  • 인터페이스를 실장하고, 목적의 동작을 실현합니다.
  • Repository가 다음 두 가지를 모두 확장하도록 합니다.JpaRepository및 커스텀인터페이스입니다

다음은 를 사용하는 작업 예입니다.JpaRepository예를 들어user_table두 개의 컬럼이 있습니다.user_id그리고.user_name.

모델 패키지의 UserEntity 클래스:

@Entity
@Table(name = "user_table")
public class UserEntity {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "user_id")
    private Long userId;

    @Column(name = "user_name")
    private String userName;

    protected UserEntity() {}

    public UserEntity(String userName) {
    this.userName = userName;

    // standard getters and setters
}

리포지토리 패키지의 사용자 지정 리포지토리 인터페이스를 정의합니다.

public interface UserCustomRepository {
    List<String> findUserNames();
}

저장소 패키지의 커스텀인터페이스에 실장 클래스를 제공합니다.

public class UserCustomRepositoryImpl implements UserCustomRepository {


    // Spring auto configures a DataSource and JdbcTemplate
    // based on the application.properties file. We can use
    // autowiring to get a reference to it.
    JdbcTemplate jdbcTemplate;

    @Autowired
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    // Now our custom implementation can use the JdbcTemplate
    // to perform JPQL queries and return basic datatypes.
    @Override
    public List<String> findUserNames() throws DataAccessException {
        String sql = "SELECT user_name FROM user_table";
        return jdbcTemplate.queryForList(sql, String.class);
    }
}

우리는 '우리'와 '우리'가 .UserRepository를 늘리다JpaRepository이치노

public interface UserRepository extends JpaRepository<UserEntity, Long>, UserCustomRepository {}

junit 5를 사용하는 단순한 테스트 클래스(처음에는 데이터베이스가 비어 있다고 가정):

@SpringBootTest
class UserRepositoryTest {

    private static final String JANE = "Jane";
    private static final String JOE = "Joe";

    @Autowired
    UserRepository repo;

    @Test
    void shouldFindUserNames() {
        UserEntity jane = new UserEntity(JANE);
        UserEntity joe = new UserEntity(JOE);

        repo.saveAndFlush(jane);
        repo.saveAndFlush(joe);

        List<UserEntity> users = repo.findAll();
        assertEquals(2, users.size());

        List<String> names = repo.findUserNames();
        assertEquals(2, names.size());
        assertTrue(names.contains(JANE));
        assertTrue(names.contains(JOE));
    }

}

언급URL : https://stackoverflow.com/questions/28912422/select-one-column-using-spring-data-jpa

반응형