java使用JPA进行数据查询和join关联查询

目录

一、问题描述

二、代码实现

[2.1 entity](#2.1 entity)

2.1.1【好友entity】

(1)entity接口

(2)entity实现类(关键点)

2.1.2【人entity】

(1)entity接口

(2)entity实现类

[2.2 jpa查询](#2.2 jpa查询)

(1)接口方法

(2)接口实现方法(关键点)


一、问题描述

我有【好友entity】和【人entity】。

【好友entity】关联了【人entity】,且他们是1:1的关系。

我想通过查询【好友entity】,

就能直接看见【人entity】的数据,

还能通过【人entity】中的内容进行筛选。

我该如何做呢?

请看下面的代码实现。

二、代码实现

【逻辑实现说明】

在【好友entity】中进行单向1:1关联关系映射,这样就能关联查看【人entity】。

在查看时,通过join的方式,就能通过name和phone筛选【人entity】中的数据了。

2.1 entity

2.1.1【好友entity】

(1)entity接口
java 复制代码
public interface CircleFriendEntity2 {
    Long getId();
    void setId(Long id);

    //

    Long getCircleId();
    void setCircleId(Long circleId);

    String getCircleRemark();
    void setCircleRemark(String circleRemark);

    //

    String getNameNick();
    void setNameNick(String nameNick);

    Long getAdminUserId();
    void setAdminUserId(Long adminUserId);

    UserSocialCapitalEntity getSocialCapitalEntity();

    String getAdminSocialCapitalIdUnique();
    void setAdminSocialCapitalIdUnique(String adminSocialCapitalIdUnique);

    String getRecommendReason();
    void setRecommendReason(String recommendReason);

    //

    CircleIdentity getIdentity();
    void setIdentity(CircleIdentity identity);

    String getAdminUnique();
    void setAdminUnique(String adminUnique);

    LocalDateTime getFirstManagerTime();
    void setFirstManagerTime(LocalDateTime firstManagerTime);

    LocalDateTime getLatestManagerTime();
    void setLatestManagerTime(LocalDateTime latestManagerTime);

    //

    CircleJoinMethod getJoinMethod();
    void setJoinMethod(CircleJoinMethod joinMethod);

    Long getInviteCircleFriendId();
    void setInviteCircleFriendId(Long inviteCircleFriendId);

    Long getInviteUserId();
    void setInviteUserId(Long inviteUserId);
    String getInviterName();
    void setInviterName(String inviterName);

    //

    Boolean getTop();
    void setTop(Boolean top);

    LocalDateTime getTopTime();
    void setTopTime(LocalDateTime topTime);

    //

    LocalDateTime getCreateTime();
    void setCreateTime(LocalDateTime createTime);

    LocalDateTime getUpdateTime();
    void setUpdateTime(LocalDateTime updateTime);

    Boolean getDeleted();
    void setDeleted(Boolean deleted);

}
(2)entity实现类(关键点)

字段配置

@OneToOne
@JoinColumn(name = "adminSocialCapitalId")

private UserSocialCapitalEntityImpl socialCapitalEntity;

getter setter方法

@Override

public UserSocialCapitalEntity getSocialCapitalEntity() {

return socialCapitalEntity;

}

public void setSocialCapitalEntity(UserSocialCapitalEntityImpl socialCapitalEntity) {

this.socialCapitalEntity = socialCapitalEntity;

}

java 复制代码
@Entity
@Table(name = "circle_friend_entity_two")
@Cacheable
public class CircleFriendEntityImpl2
        implements CircleFriendEntity2, Serializable {

    private static final long serialVersionUID = -7889618615101349957L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id; 

    private Long circleId; 

    
    private String circleRemark; 

    private String nameNick; 

    private Long adminUserId; 

    @OneToOne
    @JoinColumn(name = "adminSocialCapitalId")
    private UserSocialCapitalEntityImpl socialCapitalEntity; 

    private String adminSocialCapitalIdUnique; 


    private String recommendReason; 


    @Enumerated(EnumType.STRING)
    private CircleIdentity identity; 

    
    private String adminUnique; 

    
    private LocalDateTime firstManagerTime; 

    private LocalDateTime latestManagerTime; 


    @Enumerated(EnumType.STRING)
    private CircleJoinMethod joinMethod; 

    private Long inviteCircleFriendId; 

    private Long inviteUserId; 
    private String inviterName; 

    private Boolean top; 

    private LocalDateTime topTime; 


    private LocalDateTime createTime; 

    private LocalDateTime updateTime; 
    
    private Boolean deleted; 

    
    @Override
    public UserSocialCapitalEntity getSocialCapitalEntity() {
        return socialCapitalEntity;
    }

    public void setSocialCapitalEntity(UserSocialCapitalEntityImpl socialCapitalEntity) {
        this.socialCapitalEntity = socialCapitalEntity;
    }

    (......其他常规getter setter方法......)
}

2.1.2【人entity】

(1)entity接口
java 复制代码
public interface UserSocialCapitalEntity {
    Long getId();
    void setId(Long id);

    //

    String getName();
    void setName(String name);

    String getPhone();
    void setPhone(String phone);

}
(2)entity实现类
java 复制代码
@Table(name = "user_social_capital_entity")
@Entity
@Cacheable
public class UserSocialCapitalEntityImpl
        implements UserSocialCapitalEntity, Serializable {

    private static final long serialVersionUID = -5517289816387650441L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name; 

    private String phone; 

    
    (......常规getter setter方法......)
}

2.2 jpa查询

(1)接口方法

java 复制代码
    List<CircleFriendEntity2> listInCircle(Long circleId,
                                           CircleIdentity identity,
                                           String name,
                                           String phone,
                                           int start, int maxResult);

(2)接口实现方法(关键点)

内连接

Join<CircleFriendEntityImpl, UserSocialCapitalEntityImpl> socialCapitalEntity
= root.join("socialCapitalEntity", JoinType.INNER);

if (RenweyUtil.isNotEmpty(name)) {

predicate = criteriaBuilder.and(

predicate,

criteriaBuilder.like(

socialCapitalEntity.get("name"),

RenweyUtil.addMysqlFullTextSearch(name)));

}

if (RenweyUtil.isNotEmpty(phone)) {

predicate = criteriaBuilder.and(

predicate,

criteriaBuilder.equal(socialCapitalEntity.get("phone"), phone));

}
import javax.persistence.TypedQuery;

import javax.persistence.criteria.CriteriaBuilder;

import javax.persistence.criteria.CriteriaQuery;

import javax.persistence.criteria.Join;

import javax.persistence.criteria.JoinType;

import javax.persistence.criteria.Predicate;

import javax.persistence.criteria.Root;

java 复制代码
    @Override
    public List<CircleFriendEntity2> listInCircle(Long circleId,
                                                  CircleIdentity identity,
                                                  String name,
                                                  String phone,
                                                  int start, int maxResult) {

        CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
        CriteriaQuery<CircleFriendEntityImpl2> criteriaQuery = criteriaBuilder.createQuery(CircleFriendEntityImpl2.class);
        Root<CircleFriendEntityImpl2> root = criteriaQuery.from(CircleFriendEntityImpl2.class);

        Predicate predicate = criteriaBuilder.and(
                criteriaBuilder.equal(root.get("circleId"), circleId),
                criteriaBuilder.isFalse(root.get("deleted")));

        if (RenweyUtil.isNotEmpty(identity)) {
            predicate = criteriaBuilder.and(
                    predicate,
                    criteriaBuilder.equal(root.get("identity"), identity));
        }

        if (RenweyUtil.isNotEmpty(name)
                || RenweyUtil.isNotEmpty(phone)) {

            Join<CircleFriendEntityImpl, UserSocialCapitalEntityImpl> socialCapitalEntity
                    = root.join("socialCapitalEntity", JoinType.INNER);

            if (RenweyUtil.isNotEmpty(name)) {
                predicate = criteriaBuilder.and(
                        predicate,
                        criteriaBuilder.like(
                                socialCapitalEntity.get("name"),
                                RenweyUtil.addMysqlFullTextSearch(name)));
            }

            if (RenweyUtil.isNotEmpty(phone)) {
                predicate = criteriaBuilder.and(
                        predicate,
                        criteriaBuilder.equal(socialCapitalEntity.get("phone"), phone));
            }

        }

        criteriaQuery.where(predicate);

        criteriaQuery.orderBy(
                criteriaBuilder.asc(root.get("identity")),
                criteriaBuilder.desc(root.get("id")));

        TypedQuery<CircleFriendEntityImpl2> typedQuery = getEntityManager().createQuery(criteriaQuery);
        typedQuery.setFirstResult(start).setMaxResults(maxResult);
        return new ArrayList<>(typedQuery.getResultList());
    }

​​​​​​​****我是程序员娟娟,

致力将工作中遇到的问题和解决方案记录下来,

分享给更多需要的同行。

如果对你有帮助,不妨点个关注吧!

相关推荐
天远API4 小时前
零信任架构实战:基于天远股权穿透构建自动化供应链授信穿透网关
java·人工智能·架构·自动化
最强小杰4 小时前
claude-opus-5.5 API 接入教程:anthropic-version 头、tools 定义、流式事件格式三个常见问题全部梳理,收藏备用
java·服务器·网络·ai
Cc.Y5 小时前
Java零基础入门:方法(函数)深度掌握
java·开发语言
奋发向前wcx5 小时前
CSP-J复赛模拟赛1 王晨旭补题 2026.10.2
java·开发语言
卓怡学长5 小时前
w192基于springboot“考研情报站”微信小程序设计与实现
java·spring boot·spring·微信小程序·intellij-idea
周杰伦fans5 小时前
C#对话摘要降低Token消耗
人工智能·后端·c#
wuminyu5 小时前
JEP491中synchronized关键字引发的平台线程钉住解决方法简介
java·linux·c语言·jvm·c++
做系统的大强6 小时前
脚本说 PASS、OS 读全零 —— 到底是谁在撒谎?
后端·操作系统
anew___6 小时前
《从零手写操作系统 (20):ELF加载器——让OS读懂现代编译器》
java·服务器·前端
code2cat6 小时前
【随笔】MCP资源更新订阅:通知到达以后,Agent怎样刷新旧资料
java·后端·开发工具·ai agent·mcp