簡體   English   中英

Grails map 域 class 到 oracle 數據庫中已經存在的視圖

[英]Grails map domain class to a view that already exists in oracle database

我已經創建了一個名為 FACULTY_VIEW 的數據庫視圖,並且想要 map grails 域 class 到它。 這是域:

class FacultyInformation {

    def faculty_pidm
    def faculty_person_id
    def faculty_first_name
    def faculty_last_name

    static mapping = {
        table 'FACULTY_VIEW'
        version false
        cache 'read-only',inlcude:'non-lazy'

        faculty_pidm column:'FACULTY_PIDM'
        faculty_person_id column:'FACULTY_PERSON_ID'
        faculty_first_name column:'FACULTY_FIRST_NAME'
        faculty_last_name column:'FACULTY_LAST_NAME'        
    }

}

這是我嘗試搜索的域的 Controller 片段:

facultySearchList = FacultyInformation.createCriteria().list (max: params.max, offset: params.offset, sort:params.sort, order: params.order) {
    ilike("faculty_last_name", searchTerm )
}

啟動時,我收到此錯誤消息(這是我所期望的):

| 錯誤 2015-11-11 14:58:33,675 [localhost-startStop-1] 錯誤 hbm2ddl.SchemaUpdate - 不成功:更改表 FACULTY_VIEW 添加 ID 號(19,0)而不是 null | 錯誤 2015-11-11 14:58:33,677 [localhost-startStop-1] 錯誤 hbm2ddl.SchemaUpdate - ORA-00942:表或視圖不存在

然后一旦我執行搜索我得到這個錯誤消息:

org.hibernate.QueryException:無法解析屬性:faculty_last_name of:facultyinformation.FacultyInformation

我當然不打算從此視圖中插入或刪除,因為我只是要搜索它。

我以某種方式猜測這是一個 hibernate 問題/配置問題。

任何幫助將不勝感激:-)

第 2 部分:這是我創建視圖的數據庫變更日志:

databaseChangeLog = {
        changeSet(author: "jdannucci (generated)", id: "1447432810497-1") {
            createView("""
      SELECT DISTINCT SIRASGN_PIDM AS faculty_pidm, SPRIDEN_ID AS faculty_person_id, SPRIDEN_FIRST_NAME AS faculty_first_name, SPRIDEN_LAST_NAME AS faculty_last_name
    FROM SSBSECT , SCBCRSE, SCRLEVL SC, SIRASGN SA, SPRIDEN
    WHERE SSBSECT_TERM_CODE = (SELECT MAX(STVTERM_CODE) FROM STVTERM
                                            WHERE TRUNC(SYSDATE) BETWEEN TRUNC(STVTERM_START_DATE) AND TRUNC(STVTERM_END_DATE))
    AND SSBSECT_SUBJ_CODE=SCBCRSE_SUBJ_CODE
    AND SSBSECT_CRSE_NUMB=SCBCRSE_CRSE_NUMB
    AND SSBSECT_CRN = SIRASGN_CRN
    AND SSBSECT_SUBJ_CODE != 'FE'
    AND SIRASGN_PRIMARY_IND = 'Y'
    AND SSBSECT_TERM_CODE = SIRASGN_TERM_CODE
    AND SCRLEVL_LEVL_CODE = '01'
    AND SCRLEVL_SUBJ_CODE = SSBSECT_SUBJ_CODE
    AND SCRLEVL_CRSE_NUMB = SSBSECT_CRSE_NUMB
    AND SCRLEVL_EFF_TERM = (SELECT MAX(SCRLEVL_EFF_TERM)
                    FROM SCRLEVL
                    WHERE SCRLEVL_SUBJ_CODE = SC.SCRLEVL_SUBJ_CODE
                    AND  SCRLEVL_CRSE_NUMB = SC. SCRLEVL_CRSE_NUMB
                    AND SCRLEVL_EFF_TERM <= SSBSECT_TERM_CODE)
    AND SCBCRSE_EFF_TERM = (SELECT MAX(SCBCRSE_EFF_TERM)
         FROM SATURN.SCBCRSE X
         WHERE X.SCBCRSE_SUBJ_CODE=SSBSECT_SUBJ_CODE
         AND X.SCBCRSE_CRSE_NUMB=SSBSECT_CRSE_NUMB
         AND X.SCBCRSE_EFF_TERM <= SSBSECT_TERM_CODE)
    AND SPRIDEN_PIDM = SIRASGN_PIDM
    AND SPRIDEN_CHANGE_IND IS NULL
    ORDER BY faculty_last_name
    """, viewName: 'FACULTY_VIEW')
         }
    }

這是我的新域:

package facultyinformation

class FacultyInformation {

    def faculty_pidm
    def faculty_person_id
    def faculty_first_name
    def faculty_last_name

    static mapping = {
        table 'FACULTY_VIEW'
        version false
        cache 'read-only',inlcude:'non-lazy'

        faculty_pidm column:'FACULTY_PIDM'
        faculty_person_id column:'FACULTY_PERSON_ID'
        faculty_first_name column:'FACULTY_FIRST_NAME'
        faculty_last_name column:'FACULTY_LAST_NAME'        
    }

}

數據源:

development {
        dataSource {
            dbCreate = "none" // one of 'create', 'create-drop','update'
            url = "jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:PPRD"

            dialect = "org.hibernate.dialect.Oracle10gDialect"
        }
    }

這是給我錯誤的 controller 代碼:

facultySearchList = FacultyInformation.createCriteria().list (max: params.max, offset: params.offset, sort:params.sort, order: params.order) {
                        ilike("faculty_last_name", searchTerm )
                }

這是錯誤:

org.hibernate.QueryException: could not resolve property: faculty_last_name of: facultyinformation.FacultyInformation

變得非常沮喪.. 我想知道一起避免 hibernate 是否會更容易???

根據錯誤消息的這一部分,數據庫連接看不到您的視圖:

ORA-00942: table or view does not exist 

顯然,請確保該視圖確實存在。

如果該視圖確實存在,請檢查數據源配置,並確保它已用於正確的數據庫,並且連接參數中指定的用戶有權訪問該視圖。

我通過顯式執行SQL使用db-migration插件創建了一些視圖,即使用sql('''CREATE OR REPLACE VIEW而不是createView("""

另外,您將希望按照Burt Beckwith的本演示文稿中所述實現DdlFilterConfiguration ,從而將視圖從GORM表更新中排除: http : DdlFilterConfiguration

在這種情況下,最簡單的方法是向視圖添加一個 ID 列。 由於查詢中的所有表都有一個唯一的序列號索引,您可以將以下列添加到視圖中(我不想透露真正的專有列名,所以我們將索引稱為 <table_name>_ID,盡管那是假的)。

SSBSECT_ID||'-'||SCBCRSE_ID||'-'||SCRLEVL_ID||'-'||SIRASGN_ID||'-'||SPRIDEN_ID as SURROGATE_ID

然后更改域 class,使其如下所示:

package facultyinformation

class 師資信息{

String id
def faculty_pidm
def faculty_person_id
def faculty_first_name
def faculty_last_name

static mapping = {
    table 'FACULTY_VIEW'
    version false
    id column: 'SURROGATE_ID'
    cache 'read-only',inlcude:'non-lazy'

    faculty_pidm column:'FACULTY_PIDM'
    faculty_person_id column:'FACULTY_PERSON_ID'
    faculty_first_name column:'FACULTY_FIRST_NAME'
    faculty_last_name column:'FACULTY_LAST_NAME'        
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM