ID가 없는 Java JPA 쿼리 테이블의 방법

I. 소개

jpa에서 데이터베이스를 쿼리하려면 @Entity엔터티 클래스가 있어야 하며 이 클래스의 내용은 데이터베이스 테이블의 열과 일치해야 하며 이 클래스에는 엔터티 클래스의 열에 해당하는 필드가
있어야 합니다. Long id데이터베이스 테이블 id.

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

id그러나 내 프로젝트에 데이터베이스 테이블이 있는데 실제로 그러한 열이 없으며 일부 class_id에는 이 열이 있고 이름이 다릅니다.

CREATE TABLE `classinfo` (
  `class_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
  `class_name` varchar(200) NOT NULL DEFAULT '' COMMENT 'name',
  PRIMARY KEY (`class_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

이 경우 jpa 쿼리를 사용하면 오류가 보고되고 id 열을 찾을 수 없습니다.

@Entity코드를 변경하더라도 다음과 같이 변경하세요.

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long classId;

이 역시 불가능하며 쿼리에서도 오류가 보고됩니다(이름은 id로 불러야 함).

테이블 구조를 수정할 수 없는 것도 사실이고, 쿼리도 jpa를 사용해야 하는데, id 컬럼이 없으면 할 수 없는 거잖아요...

둘, 해결책

1. 먼저 하나의 열만 있는 빈 테이블을 생성할 수 있습니다 id. 예를 들면 다음과 같습니다.

CREATE TABLE `simpletable` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. 그런 다음 ID 열이 하나만 있는 빈 테이블에 해당하는 @Entity엔터티 클래스를 작성합니다 simpletable. 예:


import javax.persistence.*;
import java.io.Serializable;
import java.util.Objects;

/**
 * A Simpletable.
 */
@Entity
@Table(name = "simpletable")
public class Simpletable implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;


    // jhipster-needle-entity-add-field - JHipster will add fields here, do not remove
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }



    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Simpletable simpletable = (Simpletable) o;
        if (simpletable.getId() == null || getId() == null) {
            return false;
        }
        return Objects.equals(getId(), simpletable.getId());
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(getId());
    }

    @Override
    public String toString() {
        return "Simpletable{" +
            "id=" + getId() +
            "}";
    }
}

3. 그런 다음 클래스를 작성 repository하고 이를 이 엔터티 클래스에 넣은 다음 다음과 같이 다른 테이블을 쿼리합니다.


import xxx.Simpletable;
import org.springframework.data.jpa.repository.*;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;


/**
 * Spring Data  repository for the Classinfo entity.
 */
@SuppressWarnings("unused")
@Repository
public interface ClassinfoRepository extends CrudRepository<Simpletable, Long> {

    @Query(value = "select * " +
            " from classinfo  " +
            "where class_id = ?1 " +
            "order by  class_id DESC ", nativeQuery = true)
    List<Map<String,Object>> findByClassId(String id);
    
}

(1) 이 코드에서는 주로 extends CrudRepository<Simpletable, Long>여기에 넣는다 Simpletable. (테이블에 해당하는 엔터티 클래스를 넣어야 하며, 그렇지 않으면 쿼리를 실행할 때 여전히 오류가 보고된다.)

(2) 그런 다음 이 클래스에서 id 열이 없는 테이블을 쿼리합니다.classinfo

(3) classinfo테이블에는 엔터티 클래스가 없으므로(id 열이 없으므로 엔터티 클래스를 작성할 수 없음) List<Map<String,Object>>유형만 반환할 수 있으며 나중에 필드를 직접 분할하여 가져와야 합니다.

(4) 이로써 ID 없이 JPA가 테이블을 쿼리하는 방법이 구현됩니다.

3. 비고

1. return type을 쓸 수 없고 List<HashMap<String,Object>>정상적으로 key-value를 얻을 수 없다는 점에 유의하세요
2. jpa를 사용하는 경우 테이블 생성 시 자동 증가하는 기본 키로 id 컬럼을 생성하는 것이 가장 좋습니다.

おすすめ

転載: blog.csdn.net/BHSZZY/article/details/132684812
おすすめ