Как связать поле @Transient в объекте сущности из собственного запроса SQL - PullRequest
4 голосов
/ 21 июня 2011

У меня есть объекты-сущности:

@Entity
public class Tag {

    @Id
    private Long id;

    @Transient
    private int count;

    // getter, setter etc..
}

@Entity
public class Request {

    // fileds

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<Tag> tag = new HashSet<Tag>();

    // getter, setter etc..
}

Мне нужно получить все теги с количеством по запросу.

В DAO я создаю для него функцию с SQL-запросом:

select tag as id, count(rt.request) as count
from request_tag rt
where rt.request in  (...) and rt.request in (...) and etc...
group by rt.tag order by count desc

Теги найдены, но количество не является обязательным.

Как связать счетчик с запроса?

PS:

  1. Я не хочу удалять аннотацию @Transient (потому что я не хочу вести учет в БД).

  2. Я не хочу использовать @Formula (потому что это будет медленно).

1 Ответ

1 голос
/ 21 июня 2011

Вариант 1: Создайте именованный запрос с помощью select tag as id, count(rt.request) as count, после выполнения вы получите Object[2] приведение, как ожидается, и используйте.

Вариант 2: Вы можете создать еще одну сущность (скажем, TagStatistic) без @Transient и сопоставить его с собственным (!) именованным запросом

@Entity
@Table(name = "Tag")//map to the same table
@NamedNativeQueries({
  @NamedNativeQuery(name ="TagStatistic.someName",
          resultClass =  TagStatistic.class,
          query = "select tag as id, count(rt.request) as count ....
...
public class TagStatistic{
...
...