복붙노트

[SQL] Grails의에서 SQL / 데이터베이스보기

SQL

Grails의에서 SQL / 데이터베이스보기

사람은 알고 있나요 Grails를 통해 SQL보기에 접근하는 가장 좋은 방법은 무엇인가 (또는이도 가능한 경우)? 그것은 우리가 도메인 객체의 목록으로 취급하지 않을 뷰에서 행의 컬렉션을 선택합니다보기에하는 executeQuery를 사용하는 것이 일을하는 확실한 방법을 보인다. 그러나,이 경우에는 정말 우리가 완전히 관련이없는 개체 (뷰)에 대한 쿼리를 실행하기 위해 해당 도메인 클래스를 사용하고 있기 때문에, 반대하는 executeQuery를 실행하는 도메인 클래스 명확하지 않다.

보기를 나타내는 도메인 클래스를 생성시키는 것이 바람직 할 것입니다 그리고 우리는 단지 그 도메인 클래스에 대한 목록 ()를 사용할 수 있을까? Grails는 아마 모든 도메인 클래스의 테이블 스키마를 삽입, 업데이트, 삭제, 수정할 수있을 것으로 기대로이 문제가 될 것 같습니다.

[편집하다: 여기에 질문을 따르 Grails의 도메인 클래스 ID 필드없이 또는 부분적으로 NULL 복합 필드

해결법

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

    1.당신은보기 바람직한 방법 (IMO)에 액세스 할 수있는 경우에 Grails의에 일반 SQL을 사용할 수 있습니다 :

    당신은보기 바람직한 방법 (IMO)에 액세스 할 수있는 경우에 Grails의에 일반 SQL을 사용할 수 있습니다 :

    컨트롤러의 예를 들면 :

    import groovy.sql.Sql
    
    class MyFancySqlController {
    
        def dataSource // the Spring-Bean "dataSource" is auto-injected
    
        def list = {
            def db = new Sql(dataSource) // Create a new instance of groovy.sql.Sql with the DB of the Grails app
    
            def result = db.rows("SELECT foo, bar FROM my_view") // Perform the query
    
            [ result: result ] // return the results as model
        }
    
    }
    

    및 뷰 부분 :

    <g:each in="${result}">
        <tr>
            <td>${it.foo}</td>
            <td>${it.bar}</td>
        </tr>
    </g:each>
    

    나는 소스가 자명 바랍니다. 문서는 여기에서 찾을 수 있습니다

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

    2.당신은 당신의 도메인 클래스 매핑이 넣을 수 있습니다 :

    당신은 당신의 도메인 클래스 매핑이 넣을 수 있습니다 :

    static mapping = {
        cache 'read-only'
    }
    

    하지만 그것은 최대 절전 모드를 도움이된다면 그것은 뷰의 이해 모르겠어요 ... http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#performance-cache-readonly

    어쨌든, HQL은 엉덩이에 통증이 있기 때문에 우리는 우리의 현재 프로젝트에서 데이터베이스보기 Grails의 도메인 클래스 등을 많이 사용하고는 테이블을 조인하는 SQL을 사용하는 것이 간단합니다.

    당신이 생각에 대해 조심해야 할 것은, 쿼리의 최대 절전 모드 배치 (전체 플러시 사업)이다. 당신이 테이블에 뭔가를 삽입 한 다음 동일한 트랜잭션에서 해당 테이블에 의존하는 뷰를 선택하면, 당신은 당신이 삽입 된 최신 행을받지 않습니다. 당신은 당신이 당신에게 당신의 선택의 결과를 제공하기 전에 대기중인 쿼리를 세척 할 필요에서, Hibernate는 생각했을 것이다 행을 삽입 테이블을 선택한 경우 반면에 Hibernate는 실제로 아직 행을 삽입 한하지 않기 때문입니다.

    당신은 당신이 동일한 트랜잭션에서 이후 뷰를 통해 읽을 필요가 알고있는 도메인 인스턴스를 저장할 때 : 하나 개의 솔루션 (참 높이)이다.

    그것은 최대 절전 모드 홍조가 끊김없이 잘 작동 그래서, 뷰 / 도메인에있는 다른 도메인 클래스에 따라 달라 최대 절전 모드를 알려줄 방법의 일종을 가지고 멋진 그러나이 될 것입니다.

  3. ==============================

    3.그것은보기에 도메인 클래스를 매핑 단지 일반 테이블처럼 취급 할 수 있도록 완벽하게 가능합니다. 나는 Grails의 등 삽입, 삭제를 할 수 없다는 대한 몇 가지 로그 메시지를 인쇄하지만 실제로 도메인 클래스 쿼리가 아닌 다른 뭔가를하려고하지 않는 한이 오류가 발생하지 않습니다 생각합니다.

    그것은보기에 도메인 클래스를 매핑 단지 일반 테이블처럼 취급 할 수 있도록 완벽하게 가능합니다. 나는 Grails의 등 삽입, 삭제를 할 수 없다는 대한 몇 가지 로그 메시지를 인쇄하지만 실제로 도메인 클래스 쿼리가 아닌 다른 뭔가를하려고하지 않는 한이 오류가 발생하지 않습니다 생각합니다.

  4. from https://stackoverflow.com/questions/425294/sql-database-views-in-grails by cc-by-sa and MIT license