@Entity 어노테이션 붙은 클래스 필드명을 따라 컬럼명 매칭룰을 적용

이를 커스텀으로 변경

CamelCaseToUnderscoresNamingStrategy 를 상속받아 uppercase로 변경

yml 에선언

spring.jpa.hibernate:
  naming:
    physical-strategy
public class CustomColumnUppercaseStrategy extends CamelCaseToUnderscoresNamingStrategy {
    @Override
    protected Identifier getIdentifier(String name, final boolean quoted, final JdbcEnvironment jdbcEnvironment) {
        if (isCaseInsensitive(jdbcEnvironment)) {
            name = name.toUpperCase(Locale.ROOT);
        }
        return new Identifier(name, quoted);
    }
}

 

QueryDSL join 및 subquery 및 case 문 사용 예시

case문 사용시 then 값은 enum값이 들지 않으니 String 으로 변환하여 사용한다. (querydsl 5.0)

(로직적으로 처리하자)

QTbEntity innerME = new QTbEntity("ime");
        return queryFactory
                .select(Projections.constructor(TbEntity.class, tbEntity.memberId, tbEntity.roleGroup, joinBEntity.commId, joinBEntity.enumA))
                .from(tbEntity)
                .leftJoin(joinAEntity).on(tbEntity.memberId.eq(joinAEntity.userId))
                .leftJoin(joinBEntity).on(joinAEntity.commId.eq(joinBEntity.commId))
                .where(tbEntity.roleGroup.ne(
                                JPAExpressions.select(new CaseBuilder()
                                                .when(joinBEntity.enumA.eq(EnumA.EQ)).then("EQ_NAME")
                                                .when(joinBEntity.enumA.eq(EnumA.DIFF)).then("DIFF_NAME")
                                                .otherwise(tbEntity.roleGroup)
                                        ).from(innerME)
                                        .leftJoin(joinAEntity).on(innerME.memberId.eq(joinAEntity.userId))
                                        .leftJoin(joinBEntity).on(joinAEntity.commId.eq(joinBEntity.commId))
                                        .where(innerME.memberId.eq(tbEntity.memberId))
                        )
                );

ALTER TABLE `content` CHANGE `createdAt` `createdAt` 

TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL; 


수정시마다 date time 수정, 쿼이 이름을 바꿔서 사용.

'DB > Mysql' 카테고리의 다른 글

Mysql 테이블 생성, 사용자 추가  (0) 2012.05.22
Mysql Error 2003, 10061문제  (1) 2012.05.17
Work bench 작성된 DB를 EER Diagram으로 변환  (0) 2012.03.28

링크글 : http://okky.kr/article/286812

위의 질문, 답, 토의를 보는데 유익해서 스크랩 겸 정리


책 저자 : 

 실제 구글 트랜드로 검색해보면 전세계에서 JPA, Hibernate를 합한 검색어가 94%인 반면 iBatis, myBatis를 합한 검색어가 6%가 안됩니다.

SQL만 잘 작성해도 충분히 빠르게 애플리케이션을 개발할 수 있다고 생각합니다. ORM 기술은 객체 지향과 관계형 데이터베이스 둘을 활용하는 것이지 대체하는 것이 아닙니다. 따라서 관계형 데이터베이스를 잘 모르면서 ORM 기술을 사용하는 것 처럼 위험한 것도 없다

 데이터를 언제 대체될지 모르는 특정 개발 환경에 종속적으로 만든다는 건 ... 꼬리가 몸통을 흔드는 격이라고 봅니다.

 ORM은 이름 그대로 객체(O) 관계형 데이터베이스(R)을 중간에서 매핑(M)하는 것입니다. 객체 지향 애플리케이션은 객체 지향대로 다루고 관계형 데이터베이스는 관계형 데이터베이스대로 설계하고 사용할 수 있도록 중간에서 도와주는 기술일 뿐

대부분의 데이터베이스가 너무 이질적이어서 공통화를 할 수 없습니다

ORM은 한계를 인정하고, 네이티브 SQL을 사용할 수 있도록 지원합니다. 


데이터를 연산하는 형태는 was에게 맡기는게 맞는 것 같습니다.

 sql안에서 직접 계산하고 연산하는 부분은 통계를 제외하고는 지양해야 된다고 생각됩니다.


ORM 은 편리하지만, RDBMS 의 특성을 100% 살리지는 못한다고 생각합니다. 그래서 비교적 간단한 형태의 관계를 가지는 데이터들이라면 ORM 이 어울리지만, 그렇지 않은 경우 참 난해해집니다.


ORM  역시 대부분은 일반적인 형태대로 테이블이나 관계 구성을 하면 최적의 환경을 못만들겠더군요. 그래서 ORM 에 맞는 구성을 해둘 경우 더욱 쾌적한 프로그래밍이 가능하다고 느꼈는데, 이것조차 진입장벽이라는게 문제였습니다. 


 DBA 와 개발자의 경계는

무척이나 선명한 편입니다.

ORM 을 사용하게 되면 이 경계가 살짝(?) 모호해 지죠. 


 Learning Curve의 문제이지 생산성의 문제는 아니라고 봅니다. 



'DB' 카테고리의 다른 글

MS SQL Id 칼럼 초기화  (0) 2013.08.30
ORM 이란  (0) 2013.05.08

insert 작업을 하다 delete 수행 시 

다시 insert 를 하게 되면 이전 insert한 Id 다음 행 번호부터 시작하는 경우가 있다.

그럴때는 다음 명령어를 써서 Id행번호를 초기화 해주자

0은 다시 시작할 Id 행 번호 

DBCC CHECKIDENT('테이블이름',RESEED,0);


'DB' 카테고리의 다른 글

ORM의 사실과 오해  (0) 2015.08.05
ORM 이란  (0) 2013.05.08

ORM : Object Relation Mapping.

 오브젝트와 RDB 사이에 존재하는 개념과 접근방법, 성격의 차이 때문에 요구되는 불편한 작업을 제거해줘서 자바 개발자가 오브젝트를 가지고 정보를 다루면 ORM 프레임워크가 이를 RDB에 적절한 형태로 변환해주거나 그 반대로 RDB에 저장되어 있는 정보를 자바 오브젝트가 다루기 쉬운 형태로 변환해주는기술이다.

- 토비의 Spring 11장 중에서

*RDB : Relation DataBase. 관계형 데이터베이스


뭔말인지 참 어려운데 쉽게 말하면 쉽게 DB에 엑세스 하여 정보를 다룰수 있게 도와주는 방법.

이라고 생각한다.

대표적으로 Hibernate. iBatis, Spring JPA 등

'DB' 카테고리의 다른 글

ORM의 사실과 오해  (0) 2015.08.05
MS SQL Id 칼럼 초기화  (0) 2013.08.30
@OneToMany 관계에서 List를 사용하려면 항상 mappedBy 를 하셔야할겁니다.

관련 정보는 http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/ 문서에서 Collections 와 Indexed Collections (List,Map) 부분을 참조해보세요.


1.hql

 - SessionFactory로 session 생성후 hql 작성, Query 객체 생성. 쿼리 실행

2.session.save/delete

 - 제약이 많음 원하는 결과 도출 힘듬

3.HibernateTemplate find/get 등

 - 제약많음, 원하는결과 도출힘듬

4.Criteria

 - NoSql 방식으로서는 괜찮은 대안. 여러가지 응용가능

@Column(name="Price", columnDefinition="Decimal(10,2) default '100.00'")
출처 :  http://stackoverflow.com/questions/197045/setting-default-values-for-columns-in-jpa 


SeesionFactory를 사용할때 session이 없는 경우 발생한다.


web.xml 에 아래의 필터를 추가하여 세션을 생성.


<filter>

<filter-name>openSessionInViewFilter</filter-name>

<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>

<init-param>

<param-name>singleSession</param-name>

<param-value>true</param-value>

</init-param>

</filter>


<filter-mapping>

<filter-name>openSessionInViewFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

+ Recent posts