【问题标题】:Join two tables with Play Framework and JPA使用 Play Framework 和 JPA 连接两个表
【发布时间】:2011-10-24 08:50:11
【问题描述】:

如何使用 java play framework 和 jpa 连接两个表,我真的很难将我的 MySQL 查询转换为 jpa 查询。

这是我在旧 Java 代码中使用的 MySQL 查询:

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

//表一:

@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;
}

【问题讨论】:

  • @vikasTheJavaDeveloper:这最终会起作用,但 JPA 是一个相当大的技术堆栈。我发现我总是不得不求助于本机 SQL 感到沮丧和恼火,就好像我仍在使用 JDBC 一样。我想,这里的OP的内连接可以更优雅地实现,使用JPA?
  • @user686563 和你现在想出什么 JPAQL?我看不出这里涉及 playframework 的任何原因,因为这显然是一个 JPA 问题

标签: java sql jpa join playframework


【解决方案1】:

不知道我是否得到了确切的意思,但是在教程博客“YABE”中,这种连接表是由 Play 自动使用和创建的:

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

模型中描述了多对多关系(博客示例在此处的“帖子”和“标签”之间):

@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】:

每次你在一个实体中有一个名为“xxxId”的字段,而“xxxId”是另一个实体的ID,你就做错了。 JPA 的重点是使用对象引用或对象集合来操作对象以及对象之间的关联。

您的tbl_lookup_user_major 对我来说就像一个连接表。这样的连接表意味着您在 Major 和 User 之间有一个多对多(或一对多,是其中一个 ID 是唯一的)。因此,您的 Major 实体应具有以下字段:

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

你的 JPA 查询应该是这样的

select m from Major m
inner join m.users user
where user.id = :userId

【讨论】:

  • 只是一个注释 - 简单的 'JOIN' 等于 'INNER JOIN'
【解决方案3】:

示例 Jpa 查询尝试这样...

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

Role.class.getName()+" AS b WHERE a.roleId=b.roleId ");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2012-08-25
    • 1970-01-01
    • 2017-11-08
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多