2017-01-10 8 views
0

У меня есть некоторые простые модели предметной области, которая описывает таблицу лиц в БД:агрегатные функции в DAO

@Entity 
@Table(name = "persons") 
public class Person { 

private int id; 
private String firstName; 
private String lastName; 
private int age; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

@Column 
public String getFirstName() { 
    return firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

@Column 
public String getLastName() { 
    return lastName; 
} 

public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 

@Column 
public int getAge() { 
    return age; 
} 

public void setAge(int age) { 
    this.age = age; 
} 

} 

Также у меня есть некоторый класс DAO, который работает с этой моделью:

class PersonDao { 
// getById 
// add 
// remove 
// etc 
} 

Также у меня есть некоторые сервис, который работает с этим PersonDAO:

class PersonService { 
// 
} 

в этой службе я хочу, чтобы получить "COUNT (*)", "MAX (возраст)", "MIN (возраст)" от D AO, используя некоторые критерии (по первому имени в качестве примера). Каков правильный способ сделать это?

  1. Определение 3 различных методов в DAO (как GetCount (Firstname), getMin (Firstname), getMax (Firstname)) - очень плохой способ, так как он будет выполнить 3 различных запросов с ИНЕКЕ и очень медленный с большими данными.
  2. Определите некоторую модель типа «Персоналии» с этими полями 3 и верните эту модель из одного запроса - я думаю, что это плохо, потому что эта модель не является моделью домена.

Итак, каков правильный способ решить эту проблему?

ответ

0

Предполагая, что вы используете Hibernate для слоя DAO, использование непостоянной модели (второй предложенный способ) для получения трех полей - это плохо, как вы сказали. Это приемлемо, если идти первым выбором и позволить Hibernate выполнять работу за вас и выполнять агрегатные функции. Для проблем с производительностью ребята из Hibernate рекомендуют обрабатывать подобные случаи с использованием запросов HQL или критериев. Hibernate Documentation