проблема с преобразованием SQL-запроса в Hibernate-запрос - PullRequest
0 голосов
/ 13 января 2012

Привет, у меня есть как в месячной таблице jan, feb..dec, и у меня есть поля locatin и actioncount в каждом с местоположением, повторенным в каждой таблице.

У меня этот запрос написан примерно на SQL, у меня естьмесяц доменных объектов, теперь я должен преобразовать его в Hibernate Query (HQL или Criteria api или что-нибудь еще ..).Как мне конвертировать это?Количество месяцев предоставляется в виде списка и является переменной, как показано ниже, sql из этого списка monthsToQuery = [oct,nov,dec,jan] .. это также список переменных.Это может быть [февраль, мар, апр] или [июль]

select loc, sum(tcount) from (
                   (select location as loc, sum(actioncount) as tcount from oct group by location) left-join 
                   (select location as loc, sum(actioncount) as tcount from nov group by location) left-join 
                   (select location as loc, sum(actioncount) as tcount from dec group by location) left-join 
                   (select location as loc, sum(actioncount) as tcount from jan group by location)

                   ) group by loc

Я делаю левые соединения, потому что я не хочу терять какие-либо места в разные месяцы.

Дополнение: Я такжеиметь диапазон дат в качестве входных данных.До сих пор я получаю список месяцев из диапазона и получаю результаты для каждого месяца отдельно.Мне нужно написать запрос, чтобы дать окончательный требуемый результат в 1 запросе.вот что у меня есть до сих пор:

// sTblList - list of all month domains in the date range.. 
 def getSummary(sTblList,SfromDate,StoDate,res_id, groupCol,sumCol){
       try{
         Date fromDate = new Date().parse("yyyy-MM-dd", SfromDate);
         Date toDate = new Date().parse("yyyy-MM-dd", StoDate); 

        def resourceInstance=Resources.get(res_id);
        sTblList.each{
         def OnemonthList=it.createCriteria().get {    
            eq('graresource',resourceInstance)
            between('currentdate', fromDate, toDate)        
            projections {  
            sum(sumCol,'tcount')
            groupProperty(groupCol)      
                }                  
            }      

        return sumMap  // sumMap should have all months results combined
    }

Я читал некоторые места, где вместо критериев вложенности я также могу использовать псевдоним в критериях.Я новичок в этом .. кто-нибудь знает дальше?

1 Ответ

1 голос
/ 13 января 2012

, если ваша модель использует наследование

abstract class Month
{
    string location;
    int actionCount;
}

class January extends Month
{
}

session.CreateCriteria(Month.class)
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.GroupProperty("Location"))
        .Add(Projections.Sum("ActionCount")))

или интерфейс

class Month implements HasActionCount
{
    string location;
    int actionCount;
}

session.CreateCriteria(HasActionCount.class)
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.GroupProperty("Location"))
        .Add(Projections.Sum("ActionCount")))

Обновлено: следующие функции для NHibernate и SQLite (также должны работать в Hibernate)

class Month
{
    public virtual int Id { get; set; }
    public virtual string Location { get; set; }
    public virtual int ActionCount { get; set; }
}

class January : Month
{
}

class February : Month
{
}

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class xmlns="urn:nhibernate-mapping-2.2" name="ConsoleApplication1.January, ConsoleApplication1" table="`January`">
    <id name="Id">
      <generator class="identity" />
    </id>
    <property name="Location" />
    <property name="ActionCount" />
  </class>
  <class xmlns="urn:nhibernate-mapping-2.2" name="ConsoleApplication1.February, ConsoleApplication1" table="`February`">
    <id name="Id">
      <generator class="identity" />
    </id>
    <property name="Location" />
    <property name="ActionCount" />
  </class>
</hibernate-mapping>

// works as expected
IList<Month> months = session.CreateCriteria<Month>().List<Month>();

// returns the location and sum of each month though
IList<Object[]> sums = (Object[])session.CreateCriteria<Month>()
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.GroupProperty("Location"))
        .Add(Projections.Sum("ActionCount")))
    .List();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...