Это особый случай, но он может вдохновить вас на создание собственной работы. Цель здесь - подсчитать общее количество записей из двух разных таблиц, где записи соответствуют определенным критериям. Я считаю, что этот метод будет работать для любого случая, когда вам нужно объединить данные из нескольких таблиц / источников.
У меня есть несколько специальных промежуточных классов, поэтому код, который вызывает именованный запрос, является коротким и приятным, но вы можете использовать любой метод, который вы обычно используете в сочетании с именованными запросами, для выполнения вашего запроса.
QueryParms parms=new QueryParms();
parms.put("PROCDATE",PROCDATE);
Long pixelAll = ((SourceCount)Fetch.row("PIXEL_ALL",parms,logger)).getCOUNT();
Как вы можете видеть здесь, именованный запрос начинает выглядеть ужасно, как оператор объединения:
@Entity
@NamedQueries({
@NamedQuery(
name ="PIXEL_ALL",
query = "" +
" SELECT new SourceCount(" +
" (select count(a) from PIXEL_LOG_CURR1 a " +
" where to_char(a.TIMESTAMP, 'YYYYMMDD') = :PROCDATE " +
" )," +
" (select count(b) from PIXEL_LOG_CURR2 b" +
" where to_char(b.TIMESTAMP, 'YYYYMMDD') = :PROCDATE " +
" )" +
") from Dual1" +
""
)
})
public class SourceCount {
@Id
private Long COUNT;
public SourceCount(Long COUNT1, Long COUNT2) {
this.COUNT = COUNT1+COUNT2;
}
public Long getCOUNT() {
return COUNT;
}
public void setCOUNT(Long COUNT) {
this.COUNT = COUNT;
}
}
Часть волшебства здесь заключается в создании фиктивной таблицы и вставке в нее одной записи. В моем случае я назвал его dual1, потому что моя база данных - Oracle, но я не думаю, что имеет значение то, что вы называете фиктивной таблицей.
@Entity
@Table(name="DUAL1")
public class Dual1 {
@Id
Long ID;
}
Не забудьте вставить свою фиктивную запись:
SQL> insert into dual1 values (1);