문제

성배를 통해 SQL 뷰에 액세스하는 가장 좋은 접근법이 무엇인지 아는 사람이 있습니까 (또는 이것이 가능하다면)? 이 작업을 수행하는 명백한 방법은 도메인 객체의 목록으로 취급하지 않는 관점에서 행 모음을 선택하기 위해 executeQuery를 사용하는 것 같습니다. 그러나이 경우에도 어떤 도메인 클래스가 ExecuteQuery를 실행 해야하는지는 분명하지 않습니다. 실제로 우리는 완전히 관련이없는 엔티티 (보기)에 대해 쿼리를 실행하기 위해 해당 도메인 클래스를 사용하고 있기 때문입니다.

뷰를 나타내는 도메인 클래스를 만드는 것이 선호되는 다음 해당 도메인 클래스에 대해 List ()를 사용할 수 있습니까? Grails는 아마도 모든 도메인 클래스의 테이블 스키마를 삽입, 업데이트, 삭제 및 수정할 수있을 것으로 기대하기 때문에 이것에 문제가있는 것 같습니다.

편집하다:
후속 질문은 다음과 같습니다. ID 필드가없는 도메인 클래스 또는 부분적으로 늘어나는 복합 필드가 있습니다.

도움이 되었습니까?

해결책

선호하는 방법 (IMO) 뷰에 액세스하는 경우 성배에서 일반 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>

나는 그 출처가 자명하기를 바랍니다. 그만큼 문서는 여기에서 찾을 수 있습니다

다른 팁

이것을 도메인 클래스 매핑에 넣을 수 있습니다.

static mapping = {
    cache 'read-only'
}

하지만 최대 절전 모드가보기라는 것을 이해하는 데 도움이되는지 확실하지 않습니다 ... http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#performance-cache-readonly

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

그래도주의해야 할 것은 쿼리의 최대 절전 모드 배치 (및 전체 플러시 비즈니스)입니다. 테이블에 무언가를 삽입 한 다음 같은 트랜잭션에서 해당 테이블에 의존하는 뷰를 선택하면 삽입 한 최신 행을 얻지 못할 것입니다. 최대 절전 모드는 실제로 행을 삽입하지 않았기 때문에, 행을 삽입 한 테이블을 선택하면 최대 절전 모드는 선택의 결과를 제공하기 전에 보류중인 쿼리를 플러시해야한다는 것을 알아 냈을 것입니다.

한 가지 해결책은 다음과 같습니다.flush:true) 도메인 인스턴스를 저장할 때 동일한 트랜잭션에서 뷰를 읽어야합니다.

그러나 최대 절전 모드가 다른 도메인 클래스에 의존하여 최대 절전 모드 플러싱이 잘 작동하도록 최대 절전 모드를 알려주는 방법을 갖는 것은 멋질 것입니다.

도메인 클래스를보기에 매핑하는 것은 완벽하게 가능합니다. 일반 테이블처럼 취급하십시오. Grails는 인서트, 삭제 등을 수행 할 수없는 것에 대한 로그 메시지를 인쇄 할 것이라고 생각하지만 실제로 도메인 클래스와 쿼리 이외의 작업을 수행하려고하지 않는 한 오류가 발생하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top