2014-08-28 2 views
1

Мне очень любопытно, как можно использовать построитель критериев для доступа к полям унаследованного класса.Grails createCriteria на абстрактном домене

Давайте предположим, что мы имеем следующий класс:

class A { 
    String fieldOne 
    String fieldTwo 

    static hasMany = [childs: AbstractChildClass] 

} 

и класс ребенка абстрактный будет выглядеть следующим образом:

abstract class AbstractChildClass { 

    Integer valueOne 
    Integer valueTwo 
    A a 

    static mapping 
     tablePerHierarchy false 
    } 
} 

, конечно, есть несколько простирающихся классов, такие как:

class ExtendingClassOne extends AbstractChildClass { 

    DesiredObject desiredObject 

    static mapping = { 
     tablePerHierarchy false 
    } 

} 

также давайте предположим, что есть класс DesiredObject, который выглядит так:

class DesiredObject { 
    String infoA 
    String infoB 
} 

Вопрос заключается в том, как можно было бы получить поля infoA и infoB путем создания критериев для класса A. Мой подход до сих пор это:

A.createCriteria().list { 
    childs { 
     desiredObject { 
      ilike('infoA', '%something%') 
     } 
    } 
} 

Это, конечно, не работает, потому что в table. РасширениеClassOne - это только идентификатор желаемого объекта, и я не знаю, как присоединиться к объекту с помощью построителя критериев, чтобы получить его поля.

Благодарим вас за чтение.

Marco

ответ

2

не ожидает 100% соответствия между моделью предметной области и схемой БД она относится.

В вашем случае полиморфизм будет работать только с tablePerHierarchy true для AbstractChildClass.

Если вы хотите придерживаться tablePerHierarchy false, вы можете определить класс, как:

class A { 

    static hasMany = [ childrenOne:ExtendingClassOne, childrenTwo:ExtendingClassTwo ] 

} 

, таким образом, ваш запрос будет так же просто, как:

A.withCriteria{ 
    for(String c in [ 'childrenOne', 'childrenTwo' ]){ 
    "$c"{ 
     desiredObject { 
     ilike('infoA', '%something%') 
     } 
    } 
    } 
} 
+0

Спасибо за ваш ответ! К сожалению, я не могу изменить модель, так как существует довольно много расширяющих классов, которые также могут иметь детей, с которых я хочу получить поля. Надеюсь, что есть более элегантный способ, чем создание собственных SQL-запросов. – mwio

+0

не убер-инженер вашей модели домена :) – injecteer

Смежные вопросы