当前位置: 首页 > 知识库问答 >
问题:

Criteria API连接问题:不包含关系列的实体不能“连接”

邹缪文
2023-03-14

所需实体大致如下:

@Entity
@Table(name = "tb_users")
public class User {

    @Id
    @GeneratedValue
    private UUID userId;

    // Omitted other fields and getters/setters ...
}
@Entity
@Table(name = "tb_groups")
public class Group {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer groupId;

    // ....
}
@Entity
@Table(name = "tb_group_members")
public class GroupMember {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "group_id")
    private Group group;

    // getters & setters ...
}

这是与中间表的多对多关系:

集团

我想要实现的查询(通过Criteria API)基本上与以下JPQL相同:

select g from Group g join GroupMember gm on g = gm.group where gm.user = ? and  ...or whatever...

我尝试按如下方式构造CriteriaQuery:

User userToQuery = ...;
// ....
CriteriaQuery<Group> query = criteriaBuilder.createQuery(Group.class);
Root<Group> groupRoot = query.from(Group.class);
Root<GroupMember> gmRoot = query.from(GroupMember.class);
groupRoot.join(...).on(criteriaBuilder.equal(groupRoot, gmRoot.get("group"))); // I can't find a suitable join() method to specify the relationship
Predicate predicate = criteriaBuilder.equal(gmRoot.get("user"), userToQuery);
// ......

由于实体没有关联关系,我不知道如何调用join(…)方法

我必须反向声明关联,即从Group成员实体声明关联:

CriteriaQuery<GroupMember> query = criteriaBuilder.createQuery(GroupMember.class);
Root<GroupMember> gmRoot = query.from(GroupMember.class);
gmRoot.join("group");
// ......

JPA的Criteria API是否有此限制?不包含关联字段的实体如何与其他实体连接?

共有1个答案

谭炎彬
2023-03-14

基于Querydsl的实现:

private EntityManager em;

......

User user = ...; // User to query (may be null)
...
QGroup qGroup = QGroup.group;
QGroupMemeber qGMember = QGroupMember.groupMember;

JPAQueryFactory queryFactory = new JPAQueryFactory(em);
JPAQuery<Group> query = (user == null) ?
        queryFactory.selectFrom(qGroup) :
        queryFactory.select(qGroup).from(qGroup).join(qGMember).on(qGroup.eq(qGMember.group));

BooleanBuilder builder = new BooleanBuilder();
if (user != null) {
    builder.and(qGMember.user.eq(user));
}
// if (...) {
//     Other conditions that need to be added to the where clause
// }
query.where(builder);
// Paging condition or something
// ....

List<Group> result = query.fetch(); // search result
 类似资料:
  • 另一个宽大处理--B: 这里要注意,实体A和B之间没有隐式关系,B表中的a_id是手工处理的,因此--关系类似于一对多(A-->B),但不是jpa-hibernate关系。而且,我的FullDto有A的所有属性和B的列表: 现在,我想从A的存储库接口中提取所有内容(A和B表一次完成),如下所示:

  • 我有这些实体: 用户 角色 权限 一个用户有很多角色,一个角色有很多权限。 null

  • 我有两个词A,B。在这个词中A是父词,有下面的表结构。 A1-->Acolumn 甚至我也尝试过使用普通连接。PLS让我知道我错过了什么。 我使用@query来指定query。选择a From TableA a LEFT OUTER JOIN FETCH a.tableAcollection p,其中a.tableacolum=?1和p.tablebcolumn<>p.tablebcolumn。

  • [kafka-producer-network-thread>producer-1]警告org.apache.kafka.clients.networkclient-[Producer clientid=producer-1]无法建立到节点0的连接(/xx.xx.xx.xx.xx:9092)。代理可能不可用。 [主]信息org.apache.Kafka.clients.Producer.kafka

  • 我使用Java应用程序前端与MySQL 5.6服务器上的数据库进行连接和交互。使用MySQL的JDBC连接器时,我遇到了连接到服务器的问题,当连接失败时,服务器没有关闭。调用close()。但当应用程序关闭时,所有连接都会断开。下面是用于进行查询的dao类。 接下来的代码是使用数据库验证应用程序用户的方法。有一些System.out.println()语句在整个过程中跟踪con变量。 运行该方法的

  • 本文向大家介绍MySQL 可以用localhost 连接,但不能用IP连接的问题解决方法,包括了MySQL 可以用localhost 连接,但不能用IP连接的问题解决方法的使用技巧和注意事项,需要的朋友参考一下 MySQL localhost 连接,但不能用IP连接问题解决方案 主要涉及到MySQL 可以用localhost 连接,但不能用IP连接的问题 方面的内容,对于MySQL 可以用loca