2010-10-22 32 views
1

我想找出使用​​Grails GORM來執行特定類型查詢的最有效/最有效的方式。GORM查詢過濾器不是一個類的直接屬性

這是我想要以多對一關係查詢所有子/鏈接項的場景。這是一種單向關係,許多方面都使用它所鏈接的事物的ID。

一個例子是學年和該學年的學期之間的關係。在學期表中,該學期所屬學年的ID存儲在表中。然而,學年並沒有與其屬於它的學期掛鉤的任何事情。這樣做是爲了保持靈活的學期數。我希望做的就是使用像HQL這樣的東西來檢索所有擁有相同學年的學期。在常規SQL中,我們可以使用學期表的學年id列過濾行。在HQL中,它並不那麼簡單。學年id不作爲域類的屬性提供。相反,Hibernate只是用它來加載實際的學年對象。

下面的東西應該在這種情況下工作嗎?

select from Semester as s where s.year.id = ? 

在這種情況下,持有學年的學期域類的屬性稱爲年。該查詢採用年份屬性和當年的ID並使用它來過濾學期。

這只是一個例子,但我正在開發的系統包含多個類似的安排,可能需要加載一組所有具有相同鏈接域對象的域對象。

這樣做可能是一種更有效的方法。其中一個例子是使域名類的實際學年ID值可用。然而,這意味着同一列被映射到域類的多個屬性。這可能不是必要的,但它是解決這類問題的另一種可能方式。

有一些Hibernate的經驗,但當你想做更多不尋常的事情時,一些問題會在Hibernate中變得複雜。

回答

1

這看起來像基本的1:M關係,它由belongsTo/hasMany映射處理。 它不會使父表保留任何其他數據。只要有域對象:

class AcademicYear { 
    static hasMany = [semesters: Semester] 
} 

class Semester { 
    static belongsTo = AcademicYear 
} 

而學期神奇地有「學術年」propery你可以參考。和一切,只是這樣做:

AcademicYear y = AcademicYear.findByYear(2010) 
Semester s = Semester.get(1) 
y.addToSemesters(s) 
y.semesters.each{ println it } 
String year = s.academicYear.name 
def a = s.academicYear.id 

嘗試它在「grails控制檯」第一,享受。

0

儘管gorm是hibernate的另一層,但它爲常見場景提供了高效的criteriaQuery和動態查找器,當涉及異常場景時,我們必須查看條件查詢。當涉及到更加不尋常的場景時,我們必須看看hql,對於更復雜的情況,我們也可以編寫基本的sql。

以下是可用於實現一種或其他類型的查詢級別任務的較高級別的不同方式。

假設:我們有如下勞動者域:

class Employee{ 
String name 
int age 
Designation designation 

static hasMany = [teams:Team] 
} 
  1. GORM動態查找器:

    Employee.findByName("Ajay") 
    
  2. 條件查詢:

    Employee.createCriteria().list { 
         eq 'name', 'Ajay' 
    } 
    
  3. where子句:

    Employee.where { 
        name == 'ajay' && (age > 25 && age < 30) 
    }.list() 
    
  4. HQL:

    Employee.findAll('from Employee as e where e.name = :name', [name: 'Ajay']) 
    
  5. 基本SQL:

    String query = $/ 
    SELECT * from employee e 
    WHERE e.name = :name 
    /$ 
    new Employee() 
    .domainClass 
    .grailsApplication 
    .mainContext 
    .sessionFactory 
    .currentSession 
    .createSQLQuery(query) 
        .setString('name', 'Ajay') 
        .list() 
    

下面是相同的更精細的層次結構,其中是爲適用於或適用:

    dynamic finder   where clause criteria HQL  SQL 

    simple queries   yes    Yes    Yes  Yes Yes 

    complex filters       Yes    Yes  Yes Yes 

    associations        Yes    Yes  Yes Yes 

    property comparisons      Yes    Yes  Yes Yes 

    some subqueries       Yes    Yes  Yes Yes 

    eager fetches w/ complex filters       Yes  Yes Yes 

    projections            Yes  Yes Yes 
    queries with arbitrary return sets         Yes Yes 

    highly complex queries (like self joins)         Yes 

    some database specific features            Yes 

    performance-optimized queries            Yes 

更多的人可以閱讀http://tatiyants.com/how-and-when-to-use-various-gorm-querying-options/

相關問題