Соедините два стола с помощью Play Framework и JPA - PullRequest
5 голосов
/ 24 октября 2011

Как я могу объединить две таблицы, используя java play framework и jpa, мне действительно трудно конвертировать мой запрос MySQL в запрос jpa.

Вот запрос MySQL, который я использовал в своем старом коде Java:

SELECT * FROM tbl_majors
INNER JOIN tbl_lookup_user_major
ON tbl_majors.id=tbl_lookup_user_major.majorId
WHERE tbl_lookup_user_major.userId=12

// Таблица 1:

@Entity
@Table(name="tbl_majors")
public class Major extends Model {
    public Major(){

    }
    @Column(name="major_name")
    private String name;
    @Column(name="major_desc")
    private String description;
}

// Таблица 2

@Entity
@Table(name="tbl_lookup_user_major")
public class LookupUserMajor extends Model {
    public LookupUserMajor(){

    }
    private int majorId;
    private int userId;
}

Ответы [ 3 ]

2 голосов
/ 14 декабря 2011

Не знаю, смогу ли я получить здесь точную точку, но в учебном блоге "YABE" этот вид таблицы соединений используется и создается автоматически в Play:

http://www.playframework.org/documentation/1.2.4/guide6#tagging

Отношение «многие ко многим» описано в модели (между «Post» и «Tag» здесь для примера блога):

@ManyToMany(cascade=CascadeType.PERSIST)
public Set<Tag> tags;

public Post(User author, String title, String content) {
    ...
    this.tags = new TreeSet<Tag>();
    ...
    this.title = title;
    this.content = content;
    ...
}

YAML для данных записей:

Post(jeffPost):
    title:          The MVC application
    postedAt:       2009-06-06
    author:         jeff
    tags:           
                    - play
                    - architecture
                    - mvc

После запуска приложения я проверяю базу данных и автоматически создается таблица "post_tag", а все ссылки между двумя таблицами выполняются (post_ids и tags_ids заполнены).

Получение данных выглядит какпросто как:

"select distinct p from Post p join p.tags as t"

Может кто-нибудь это подтвердить?Потому что плохо знакомы с Java, JPA и Play ^^

Если это правильно, это выглядит проще, чем управление таблицей объединения "вручную".

2 голосов
/ 24 октября 2011

Каждый раз, когда у вас есть имя поля «xxxId» в сущности, а «xxxId» - это идентификатор другой сущности, вы что-то сделали неправильно.Задача JPA - манипулировать объектами и связями между объектами, используя ссылки на объекты или коллекции объектов.

Ваш tbl_lookup_user_major для меня выглядит как стол соединения.Такая таблица соединений означает, что у вас есть много ко многим (или один ко многим, если один из идентификаторов уникален) между Major и User.Итак, ваша Major сущность должна иметь следующее поле:

@ManyToMany
@JoinTable(...) // details omitted
private Set<User> users;

И ваш запрос JPA должен выглядеть как

select m from Major m
inner join m.users user
where user.id = :userId
0 голосов
/ 27 апреля 2012

Пример запроса Jpa попробуйте вот так ...

Query query = JPA.em().createQuery(" SELECT * FROM "+User.class.getName() +" AS a JOIN "+ 

Role.class.getName()+" AS b WHERE a.roleId=b.roleId ");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...