Play Framework Доступ к ассоциации ManyToMany

У меня есть следующие две модели в моем проекте:

@Entity
public class Reports extends Model{
    @Id
    @GeneratedValue
    public int id;
    @ManyToMany(cascade = CascadeType.ALL)
    public List<Tags> tags;

а также

@Entity
public class Tags extends Model{
    @Id
    public String name;
    @ManyToMany(cascade = CascadeType.ALL)
    public Reports reports;

Поскольку у этих двух сущностей есть ассоциация @ManyToMany, Play! автоматически создает таблицу в моей базе данных PostgreSQL:

create table reports_tags (
  reports_id                     integer not null,
  tags_name                      varchar(255) not null,
  constraint pk_reports_tags primary key (reports_id, tags_name))
;

А вот пример данных о том, как должен выглядеть reports_tags:

reports_id     tags_name
     1            pie
     1            bar
     1            line
     3            plot
     3            bar
     4            scattered
     4            plot

У меня проблема в том, что я хочу find all reports where tags_name = 'bar'

Итак, с помощью этого вызова «запроса» я должен вернуть reports с id 1 и 3.

Используя обычный способ

Ebean.find(Reports.class)
    .where()
    .eq("tags_name", "bar")
    .findList()

не будет работать, потому что нет таких полей с tags_name в модели/таблице Reports

Я не знаю, какой код должен выполнять этот вызов запроса, так как мой опыт работы с Ebean очень мал.


person cYn    schedule 09.08.2013    source источник
comment
Вы должны пометить его языком, на котором играете.   -  person Marc-Andre    schedule 09.08.2013
comment
Я прошу прощения за то. Я только что отметил это. Использование Java.   -  person cYn    schedule 09.08.2013
comment
Не нужно извиняться ! Это просто для помощи в формате кода и, если возможно, для вашего вопроса.   -  person Marc-Andre    schedule 09.08.2013


Ответы (1)


Я никогда не работал с этим Play! framework, но насколько я понимаю часть его содержит реализацию JPA. В JPA при запросе чего-либо вы должны ссылаться на имя поля объекта java, а не на столбец в самой таблице, т.е. ваш запрос должен быть примерно таким

Ebean.find(Reports.class)
.where()
.eq("tags.name", "bar")
.findList()

Вы можете обратиться к примерам в начале javadoc здесь

надеюсь, это поможет

person Cyril Gavrailov    schedule 09.08.2013
comment
ВОТ ЭТО ДА!!!! Это было!! Это точно так, как вы сказали. Я потратил так много времени на это, думая, что моя база данных может нуждаться в некоторой реорганизации. Человек, это отстой, не зная синтаксиса! Еще раз спасибо. - person cYn; 10.08.2013