복붙노트

[SPRING] 최대 절전 모드 - 1 열에 2 열을 결합하는 방법이 있습니까?

SPRING

최대 절전 모드 - 1 열에 2 열을 결합하는 방법이 있습니까?

Spring & Hibernate를 사용하여 webapp를 개발 중입니다.

표 1 : BaseTable

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| Id         | bigint(20)   | NO   | PRI |         | auto_increment |
| Serial1    | varchar(255) | YES  |     | NULL    |                |
| Serial2    | varchar(255) | YES  |     | NULL    |                |
| ModelNum   | varchar(255) | YES  |     | NULL    |                |
| ...        | ....         | ..   | 0   |         |                |
+------------+--------------+------+-----+---------+----------------+ 

표 2 : 세부 테이블

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| Id1        | varchar(20)  | NO   | PRI |         |                |
| Id2        | varchar(20)  | NO   | PRI |         |                |
| Id3        | varchar(20)  | NO   | PRI |         |                |
| Serial     | varchar(255) | YES  |     | NULL    |                |
| ...        | ....         | ..   | 0   |         |                |
+------------+--------------+------+-----+---------+----------------+

일련 번호를 기반으로 테이블을 조인해야합니다. Table2의 Serial에는 Table1의 Serial1 또는 Serial2의 값이 포함될 수 있으므로 OR 연산자처럼 비교해야합니다. 테이블에 hbm.xml을 사용하고 있습니다. 어노테이션 매핑이 없습니다. 나는 다음과 같은 테이블을 조인했다.

<one-to-one name="notes"
    class="Notes" entity-name="Notes">
</one-to-one>

전에이 쿼리를 사용했습니다.

SELECT A.* FROM Table2 As a INNER JOIN Table1 As b 
ON (a.Serial = b.Serial1 or a.Serial = b.Serial2);

이 http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/associations.html을 살펴 보았지만 키 열만 사용 중입니다.

이 시나리오에서 HBM.XML을 사용하여 어떻게 가입합니까? 가능한가?

해결법

  1. ==============================

    1.해결책 1

    해결책 1

    Table2를 참조하는 외래 키를 노출하는 Table1에서 데이터베이스 뷰를 만듭니다. 어쨌든보기에 사용할 게시 된 쿼리의 외래 키를 투영합니다. 그런 다음 엔티티를 뷰에 맵핑하십시오.

    해결책 2

    조인 수식 사용 :

    예를 들어 Table1에 매핑 된 엔터티에서 Table2에 매핑 된 엔터티와의 다 대일 연결을 정의합니다 (사용 사례로 보입니다).

    @ManyToOne
    @JoinColumnsOrFormulas({
          @JoinColumnOrFormula(formula=@JoinFormula(value="(SELECT t2.serial FROM Table2 t2 WHERE serial1 = t2.serial OR serial2 = t2.serial)", referencedColumnName="serial"))
        })
    private Entity2 entity2;
    

    그러나, 조인 수식은 당분간 Hibernate에서 매우 약해 보입니다. (저는이 일을 many-to-one 연관으로 만 만들었고 Entity2는 Serializable을 구현해야했습니다; 그렇지 않으면 작동하지 않아서 이상한 NullPointer- 및 ClassCastExceptions).

  2. ==============================

    2.이 목적으로 네이티브 쿼리를 사용해야합니다.

    이 목적으로 네이티브 쿼리를 사용해야합니다.

    String sql = "SELECT A.* FROM Table2 As a INNER JOIN Table1 As b "
               + " ON (a.Serial = b.Serial1 or a.Serial = b.Serial2);";
    SQLQuery query = session.createSQLQuery(sql);
    query.addEntity(Table2.class);
    List<Table2> tableContent  = query.list();
    
  3. from https://stackoverflow.com/questions/32012727/hibernate-is-there-a-way-to-join-2-columns-against-1 by cc-by-sa and MIT license