2010-10-22 64 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/