스프링 데이터 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가 있다고 가정합니다.
저장소 구현:
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 }
이거면 되겠네요.
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
'source' 카테고리의 다른 글
주문 속성에 직접 액세스하지 마십시오(WooCommerce 3.0). (0) | 2023.03.23 |
---|---|
여러 인수로 함수를 바인딩하는 AngularJS 디렉티브 (0) | 2023.03.23 |
GROUP BY는 어떻게 작동합니까? (0) | 2023.03.23 |
자동으로 WordPress 표시 중지자동으로 WordPress 표시 중지태그태그 (0) | 2023.03.23 |
jQuery ajax 응답 html로 div 업데이트 (0) | 2023.03.23 |