programing

Spring JPA를 사용하여 엔티티의 선택된 속성만 가져오려면 어떻게 해야 합니까?

testmans 2023. 3. 21. 21:47
반응형

Spring JPA를 사용하여 엔티티의 선택된 속성만 가져오려면 어떻게 해야 합니까?

Spring Boot (1.3.3)를 사용하고 있습니다.RELEASE)와 하이버네이트 JPA를 사용합니다.내 엔티티는 다음과 같습니다.

@Data
@NoArgsConstructor
@Entity
@Table(name = "rule")
public class RuleVO {

    @Id
    @GeneratedValue
    private Long id;

    @Column(name = "name", length = 128, nullable = false, unique = true)
    private String name;

    @Column(name = "tag", length = 256)
    private String tag;

    @OneToMany(mappedBy = "rule", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<RuleOutputArticleVO> outputArticles;

    @OneToMany(mappedBy = "rule", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<RuleInputArticleVO> inputArticles;
}

내 저장소는 다음과 같습니다.

@Repository
public interface RuleRepository extends JpaRepository<RuleVO, Long> {
}

경우에 따라서는 엔티티 RuleVO의 ID 및 이름 속성만 가져올 필요가 있습니다.어떻게 하면 좋을까요?Criteria API와 Projections를 사용하여 실행할 수 있어야 한다는 공지를 발견했습니다만, 어떻게 하면 좋을까요?미리 감사 드려요.보이텍

갱신:

지적받은 대로 귀찮고 잘 할 수 있기 때문에 웹을 둘러본 후 답변을 갱신하고 있습니다.

다음은 ID와 이름만 가져오는 방법의 예입니다.

@Repository
public interface RuleRepository extends JpaRepository<RuleVO, Long> {

    @Query("SELECT r.id FROM RuleVo r where r.name = :name") 
    List<Long> findIdByName(@Param("name") String name);

    @Query("SELECT r.name FROM RuleVo r where r.id = :id") 
    String findNameById(@Param("id") Long id);
}

이 업데이트가 도움이 되기를 바랍니다.


오래된 답변:

항상 엔티티인 행을 선택하기 때문에 특정 속성 이름/ID만 검색할 수 없습니다.이는 스프링 또는 해당 SQL 데이터베이스가 설계되지 않았기 때문입니다.

엔티티 내의 변수를 쿼리할 수 있습니다.예를 들어 다음과 같습니다.

@Repository
public interface RuleRepository extends JpaRepository<RuleVO, Long> {

    public RuleVo findOneByName(String name);
    public RuleVo findOneByNameOrId(String name, Long id);
    public List<RuleVo> findAllByName(String name);
    // etc, depending on what you want
}

필요에 따라 원하는 대로 수정할 수 있습니다.자동 전원 저장소를 통해 이러한 메서드를 직접 호출할 수 있습니다.

자세한 옵션과 예는 http://docs.spring.io/spring-data/jpa/docs/current/reference/html/ 섹션 5.3을 참조하십시오.

interface IdOnly{
    String getId();
}

@Repository
public interface RuleRepository extends JpaRepository<RuleVO, Long> {
    public List<IdOnly> findAllByName(String name);
}

매우 오래된 게시물인 것을 알 수 있지만, 아직 답을 찾고 있는 사람이 있다면 이것을 사용해 보세요.그것은 나에게 효과가 있었다.

JPQL을 사용하여 특정 열을 가져오도록 사용자 정의 생성자를 정의할 수도 있습니다.

예:

{javaPackagePath}을(를) JPQL에서 생성자로 사용하는 클래스의 전체 Java 패키지 경로로 대체합니다.

public class RuleVO {
   public RuleVO(Long id, String name) {
    this.id = id;
    this.name = name;
   }
}


@Repository
public interface RuleRepository extends JpaRepository<RuleVO, Long> {

    @Query("SELECT new {javaPackagePath}.RuleVO(r.id, r.name) FROM RuleVo r where r.name = :name") 
    List<RuleVO> findIdByName(@Param("name") String name);
}

네, 프로젝션으로 달성할 수 있습니다.적용할 수 있는 방법은 여러 가지가 있습니다.

Spring Data Hopper로 업그레이드할 수 있으면 투영을 쉽게 지원할 수 있습니다.사용 방법에 대해서는, 레퍼런스 메뉴얼을 참조해 주세요.

그 이외의 경우는, 우선 로드하는 어트리뷰트를 가지는 DTO 를 작성합니다.다음은 예를 제시하겠습니다.

package org.example;

public class RuleProjection {

    private final Long id;

    private final String name;

    public RuleProjection(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

물론 롬복 주석도 사용할 수 있습니다.

그런 다음 JPQL 쿼리에서 다음과 같이 사용할 수 있습니다.

select new org.example.RuleProjection(rule.id, rule.name) from RuleVO rule order by rule.name

쿼리에서 DTO 클래스 이름을 사용하지 않으려면 QueryDSL을 사용하여 자체 쿼리 메서드를 구현하는 방법도 있습니다.Spring Data JPA에서는 다음을 수행해야 합니다.

  • 새 메서드를 사용하여 새 인터페이스를 만듭니다.예:

    public interface RuleRepositoryCustom {
       public List<RuleProjection> findAllWithProjection();
    }
    
  • 저장소를 변경하여 새 인터페이스를 확장합니다.예:

    public interface RuleRepository extends JpaRepository<RuleVO, Long>, RuleRepositoryCustom {
    ...
    
  • Spring Data JPA QueryDSL 지원을 사용하여 사용자 지정 저장소 구현을 만듭니다.미리 Maven 플러그인을 사용하여 QueryDSL의 Q Classes를 생성해야 합니다.예:

    public class RuleRepositoryImpl {
    
        public List<RuleProjection> findAllWithProjection() {
            QRuleVO rule = QRuleVO.ruleVO;
            JPQLQuery query = getQueryFrom(rule);     
            query.orderBy(rule.name.asc());
            return query.list(ConstructorExpression.create(RuleProjection.class, rule.id, rule.name));
        }
    }
    

@Query annotation(HQL)을 사용하여 이를 수행할 수 있습니다.

아래의 스프링 문서를 참조하십시오.

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/ # jpa.query-methods.at - http://filename

(@Query in spring 문서 검색)

언급URL : https://stackoverflow.com/questions/37167422/how-to-fetch-only-selected-attributes-of-an-entity-using-spring-jpa

반응형