JPA 多对多JPQL查询语句怎么写?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JPA 多对多JPQL查询语句怎么写?相关的知识,希望对你有一定的参考价值。

Order(订单)和Product(产品),实体类的注解是manyTomany ,两个实体都是set 集合,中间表(order_product)有两个字段 order_Id和product_Id。现在我想查询ID为1的订单下的所有产品。 我知道用inner join ,但是我忘记查询了,用jpql 面向对象的实体查询语句谢谢!!

有中间表了为什么还要做成多对多的.这样的话就不能使用jpql,因为你的中间表没有对应的实体。可以将Order和order_product做成1对多,Product和order_product做成多对1。这样就可以了 参考技术A String sql = "select enterprise from Enterprise enterprise join enterprise.projects project where project.id = :projectId and enterprise.enterpriseType=:enterpriseType ORDER BY enterprise.createDate";
return entityManager.createQuery(sql, Enterprise.class).setParameter("projectId", projectId)
.setParameter("enterpriseType", templateType).getResultList();

private Set<Project> projects ;

@JsonIgnore
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name="ol_project_enterprise")
public Set<Project> getProjects()
return projects;

JPA2(JPQL)中的多对多选择查询

【中文标题】JPA2(JPQL)中的多对多选择查询【英文标题】:ManyToMany select query in JPA2(JPQL) 【发布时间】:2016-07-08 00:12:57 【问题描述】:

我有两个表:多对多关系中的用户和角色。

@Entity
@Table(name = "user")
public class User implements Serializable 

    @Id
    @Column(name = "user_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long userId;

    @ManyToMany
    @JoinTable(name = "user_role",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles;

//getters, setters

@Entity
@Table(name = "role")
public class Role implements Serializable 

    @Id
    @Column(name = "role_id")
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long roleId;

    @Column(name = "role_code")
    private String roleCode;


    @ManyToMany(mappedBy = "roles")
    @JsonIgnore
    private Set<User> users;

//getters,setters


如果用户具有角色,例如“ROLE_USER”,我想选择所有用户和所有 HIS 角色。

我是在原生 sql 中完成的,但我想使用 JPQL 或 CriteriaQuery。

我在 JPQL 中尝试过(将早期的获取类型更改为 EAGER,因为在子查询中我不能使用连接获取):

public List<User> findUsersByRole(String roleName, int startNumber, int endNumber) 
    Query q = em.createQuery("select u from User u join fetch u.roles r WHERE u.userId in (SELECT uu.userId FROM User uu join uu.roles rr WHERE rr.roleCode like :roleName)")
            .setParameter("roleName", roleName)
            .setFirstResult(startNumber)
            .setMaxResults(endNumber);
    return q.getResultList();
 

它可以按我的意愿工作,但是是否可以不将 Fetching 类型更改为 EAGER? 感谢您的回复。

【问题讨论】:

这行不通? select u from User u join fetch u.roles join u.roles r WHERE r.roleCode like :roleName。如果对你有用,我会用更多关于 jpql 的细节来回答这个问题。 是的,现在可以使用了,谢谢 【参考方案1】:

你可以这样做:

public List<User> findUsersByRole(String roleName, int startNumber, int endNumber) 
    Query q = em.createQuery("select u from User u join fetch u.roles join u.roles r WHERE r.roleCode like :roleName")
            .setParameter("roleName", roleName)
            .setFirstResult(startNumber)
            .setMaxResults(endNumber);
    return q.getResultList();
 

【讨论】:

以上是关于JPA 多对多JPQL查询语句怎么写?的主要内容,如果未能解决你的问题,请参考以下文章

jpql语句

ORM规范: JPA

多对多查询 jpql

具有多对多关系的 JPQL 查询

JPQL查询多对多连接表

返回涉及多对多关系的实体的 JPQL 查询