[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
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.이 목적으로 네이티브 쿼리를 사용해야합니다.
이 목적으로 네이티브 쿼리를 사용해야합니다.
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();
from https://stackoverflow.com/questions/32012727/hibernate-is-there-a-way-to-join-2-columns-against-1 by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] mongo 사용자 정의 변환기를 사용하지 않는 Spring (0) | 2019.04.21 |
---|---|
[SPRING] 스프링 어플리케이션에 각도를 삽입하여 서빙을 실행할 때 스프링 컨트롤러에 액세스 (0) | 2019.04.21 |
[SPRING] 스프링 캐쉬 추상화 VS 인터페이스 VS 키 매개 변수 ( "캐시 조작으로 리턴 된 널 (Null) 키"오류) (0) | 2019.04.21 |
[SPRING] 잭슨 ObjectMapper () 클래스의 writeValueAsString () 메서드를 사용할 때이 무한 재귀를 해결하는 방법 (StackoverflowError)? (0) | 2019.04.21 |
[SPRING] spring-mvc로 JSON에 대한 예외 직렬화 (0) | 2019.04.21 |