스프링 JPA 특정 컬럼 선택
Spring JPA를 사용하여 모든 데이터베이스 작업을 수행합니다.그러나 Spring JPA의 테이블에서 특정 컬럼을 선택하는 방법을 알 수 없습니다.
예를 들어 다음과 같습니다.
SELECT projectId, projectName FROM projects
스프링 데이터 JPA(doc)의 투영을 사용할 수 있습니다.이 경우 인터페이스를 만듭니다.
interface ProjectIdAndName{
String getId();
String getName();
}
저장소에 다음 메서드를 추가합니다.
List<ProjectIdAndName> findAll();
구문은 별로 마음에 들지 않지만(약간 해킹된 것처럼 보이지만) 이것이 제가 찾은 솔루션 중 가장 우아한 것입니다(JPA 저장소 클래스의 커스텀 JPQL 쿼리를 사용합니다).
@Query("select new com.foo.bar.entity.Document(d.docId, d.filename) from Document d where d.filterCol = ?1")
List<Document> findDocumentsForListing(String filterValue);
그럼 당연히 컨스트럭터만 제공하면 됩니다.Document
받아들이다를 받아들이다docId
&filename
아르그
설정할 수 .nativeQuery = true
@Query
a의 Repository
다음과 같이 합니다.
public static final String FIND_PROJECTS = "SELECT projectId, projectName FROM projects";
@Query(value = FIND_PROJECTS, nativeQuery = true)
public List<Object[]> findProjects();
단, 맵핑은 사용자가 직접 수행해야 합니다.이러한 두 가지 값만 필요한 경우가 아니라면 이와 같은 일반적인 매핑 룩업을 사용하는 것이 더 쉬울 수 있습니다.
public List<Project> findAll()
Spring 데이터 문서도 살펴볼 가치가 있을 것입니다.
제 상황에서는 json 결과만 있으면 됩니다.이렇게 하면 됩니다.
public interface SchoolRepository extends JpaRepository<School,Integer> {
@Query("select s.id, s.name from School s")
List<Object> getSchoolIdAndName();
}
컨트롤러:
@Autowired
private SchoolRepository schoolRepository;
@ResponseBody
@RequestMapping("getschoolidandname.do")
public List<Object> getSchool() {
List<Object> schools = schoolRepository.getSchoolIdAndName();
return schools;
}
이 경우 필수가 아닌 필드(필수가 있는 필드만 포함) 없이 개별 엔티티 클래스를 만들었습니다.
엔티티를 같은 테이블에 매핑합니다.모든 열이 필요한 경우 이전 엔티티를 사용하고 일부 열만 필요한 경우 Lite 엔티티를 사용합니다.
예.
@Entity
@Table(name = "user")
Class User{
@Column(name = "id", unique=true, nullable=false)
int id;
@Column(name = "name", nullable=false)
String name;
@Column(name = "address", nullable=false)
Address address;
}
다음과 같은 것을 작성할 수 있습니다.
@Entity
@Table(name = "user")
Class UserLite{
@Column(name = "id", unique=true, nullable=false)
int id;
@Column(name = "name", nullable=false)
String name;
}
가져올 열을 알고 있을 때 이 기능이 작동합니다(이 기능은 변경되지 않습니다).
열을 동적으로 결정해야 하는 경우 작동하지 않습니다.
새로운 Spring 버전에서는 다음과 같은 작업을 수행할 수 있습니다.
네이티브 쿼리를 사용하지 않을 경우 다음과 같이 할 수 있습니다.
public interface ProjectMini {
String getProjectId();
String getProjectName();
}
public interface ProjectRepository extends JpaRepository<Project, String> {
@Query("SELECT p FROM Project p")
List<ProjectMini> findAllProjectsMini();
}
네이티브 쿼리를 사용하면 다음과 같이 할 수 있습니다.
public interface ProjectRepository extends JpaRepository<Project, String> {
@Query(value = "SELECT projectId, projectName FROM project", nativeQuery = true)
List<ProjectMini> findAllProjectsMini();
}
자세한 내용은 문서를 참조하십시오.
제 생각에는 이것이 훌륭한 해결책입니다.
interface PersonRepository extends Repository<Person, UUID> {
<T> Collection<T> findByLastname(String lastname, Class<T> type);
}
이렇게 해서
void someMethod(PersonRepository people) {
Collection<Person> aggregates =
people.findByLastname("Matthews", Person.class);
Collection<NamesOnly> aggregates =
people.findByLastname("Matthews", NamesOnly.class);
}
Spring-Data와 함께 제공되는 QueryDSL을 사용하는 것이 가장 쉬운 방법일 것입니다.
질문에 대한 답은 다음과 같습니다.
JPAQuery query = new JPAQuery(entityManager);
List<Tuple> result = query.from(projects).list(project.projectId, project.projectName);
for (Tuple row : result) {
System.out.println("project ID " + row.get(project.projectId));
System.out.println("project Name " + row.get(project.projectName));
}}
엔티티 매니저는 자동 설정이 가능하며 *QL 언어를 사용하지 않고 오브젝트 및 클래스로 항상 작업할 수 있습니다.
링크에서 볼 수 있듯이 마지막 선택은 거의 저에게 더 우아한 것 같습니다. 즉, 결과를 저장하기 위해 DTO를 사용하는 것입니다.다음 예제를 적용하십시오.
JPAQuery query = new JPAQuery(entityManager);
QProject project = QProject.project;
List<ProjectDTO> dtos = query.from(project).list(new QProjectDTO(project.projectId, project.projectName));
프로젝트의 정의DTO:
class ProjectDTO {
private long id;
private String name;
@QueryProjection
public ProjectDTO(long projectId, String projectName){
this.id = projectId;
this.name = projectName;
}
public String getProjectId(){ ... }
public String getProjectName(){....}
}
Spring Data JPA를 사용하여 데이터베이스에서 특정 열을 선택하는 프로비저닝이 있습니다.
----DAOImpl -----
@Override
@Transactional
public List<Employee> getAllEmployee() throws Exception {
LOGGER.info("Inside getAllEmployee");
List<Employee> empList = empRepo.getNameAndCityOnly();
return empList;
}
----Repo -----
public interface EmployeeRepository extends CrudRepository<Employee,Integer> {
@Query("select e.name, e.city from Employee e" )
List<Employee> getNameAndCityOnly();
}
내 경우에는 100% 효과가 있었다.고마워요.
JPQL을 사용할 수 있습니다.
TypedQuery <Object[]> query = em.createQuery(
"SELECT p.projectId, p.projectName FROM projects AS p", Object[].class);
List<Object[]> results = query.getResultList();
또는 네이티브 SQL 쿼리를 사용할 수 있습니다.
Query query = em.createNativeQuery("sql statement");
List<Object[]> results = query.getResultList();
저장소 인터페이스 클래스에 다음 코드를 적용할 수 있습니다.
entityname은 프로젝트와 같은 데이터베이스 테이블 이름을 의미합니다.리스트는 프로젝트가 프로젝트에서 엔티티 클래스임을 의미합니다.
@Query(value="select p from #{#entityName} p where p.id=:projectId and p.projectName=:projectName")
List<Project> findAll(@Param("projectId") int projectId, @Param("projectName") String projectName);
지정할 수 있습니다.null
네이티브 SQL의 필드 값으로 지정합니다.
@Query(value = "select p.id, p.uid, p.title, null as documentation, p.ptype " +
" from projects p " +
"where p.uid = (:uid)" +
" and p.ptype = 'P'", nativeQuery = true)
Project findInfoByUid(@Param("uid") String uid);
@jombie가 제안하는 답변을 사용할 수 있습니다.
- 엔티티 클래스 외부에 있는 별도의 파일에 인터페이스를 배치합니다.
- 네이티브 쿼리 사용 여부(필요에 따라 선택 가능)
- 덮어쓰기 안 함
findAll()
이 목적을 위한 방법. 단, 선택한 이름을 사용한다. - 반품하는 것을 잊지 않다
List
새로운 인터페이스로 파라미터화(예:List<SmallProject>
).
네이티브 쿼리 사용:
Query query = entityManager.createNativeQuery("SELECT projectId, projectName FROM projects");
List result = query.getResultList();
public static final String FIND_PROJECTS = "select ac_year_id,ac_year from tbl_au_academic_year where ac_year_id=?1";
@Query(value = FIND_PROJECTS, nativeQuery = true)
public List<Object[]> findByAcYearId(Integer ac_year_id);
이거면 돼
다음과 같이 JPARepository를 업데이트할 수 있습니다.
@Query("select u.status from UserLogin u where u.userId = ?1 or u.email = ?1 or u.mobile = ?1")
public UserStatus findByUserIdOrEmailOrMobile(String loginId);
여기서 UserStatus는 Enum입니다.
public enum UserStatus
{
New,
Active,
Deactived,
Suspended,
Locked
}
언급URL : https://stackoverflow.com/questions/22007341/spring-jpa-selecting-specific-columns
'programing' 카테고리의 다른 글
문자열을 반환하는 Spring MVC @Response Body 메서드에서 HTTP 400 오류로 응답하는 방법 (0) | 2022.07.08 |
---|---|
계산된 속성 내의 $el에 액세스합니다. (0) | 2022.07.08 |
부동 소수점이 아닌 정수를 포함하는 경우 이중 변수 선택 (0) | 2022.07.07 |
인컴포넌트 내비게이션가드 콜백이 작동하지 않음: Nuxt JS 및 "beforeRouteEnter" (0) | 2022.07.07 |
v-bind 개체를 사용하여 하위 구성 요소에서 소품을 가져오는 방법 (0) | 2022.07.07 |