2012-04-18 3 views
0

У меня есть классы Doctor и Patient, где у каждого врача есть пациенты (1: m). Как найти врача (или врачей) у большинства пациентов в HQL?MAX FROM COUNT в HQL

Здесь запрос SQL:

SELECT D.doctorName, count(D.patientId) AS tot FROM Doctors AS D GROUP BY D.doctorName HAVING count(D.patientId)= (SELECT max(A.pid) FROM(SELECT count(D.patientId) AS pid FROM Doctors AS D GROUP BY D.doctorName) AS A)

Основная проблема заключается в том, что я не могу написать подзапрос в FROM месте.

Большое спасибо.

R

+0

Я не думаю, что запрос делает то, что вы думаете, что он делает. Рассмотрим случай, когда несколько врачей имеют одинаковое количество пациентов. –

+0

Дубликаты? Не влияет. – Riccardo

+0

Нет, я имею в виду, например, у одного врача есть два (разных) пациента, а у другого врача два (снова разных) пациента. Таким образом, есть два разных врача и четыре разных пациента. Нет дубликатов. –

ответ

1

Решено! Я создал функцию CRITERIA для замены подзапроса. Не элегантный, но работает!

def myList = [] 
    String tempName = "" 
    int patPosition = 0 
    int myListPosition = -1 
    int find = 0 
    int maxOcc = 0 

    def c = Doctor.createCriteria() 
    def pat = c.list {    
     patients {   
     } 
    } 

    while(patPosition<pat.size()){ 

     find=0 
     tempName=pat[patPosition].lastName //Some constraints to add 
     find=pat.lastName.count(tempName) 

     if(find>maxOcc){ 
      maxOcc=find 
     } 

     myListPosition=myListPosition+1 
     myList[myListPosition]=find 

     patPosition=patPosition+find 

    } 

    print "\n\nLIST -> "+myList 
    print "MAX -> "+maxOcc 

    String queryToDo= "SELECT d.name, count(p) "+ 
         "FROM Doctor as d INNER JOIN d.patients as p "+ 
         "GROUP BY d.name "+ 
         "HAVING count(p) = $maxOcc" 

    def query = Doctor.executeQuery(queryToDo) 
    render query 
0

Больше Синтетический:

pat.eachWithIndex{item, index-> 
      if (index.equals(index2)){ 
      patCount=0 
      patCount=pat.count(item)  
      index2=index2+patCount 
       if(patCount>maxOcc){ 
        maxOcc=patCount 
       } 
      } 
    }