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

目录

一、问题描述

二、代码实现

2.1 entity

2.1.1【好友entity】

(1)entity接口

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

2.1.2【人entity】

(1)entity接口

(2)entity实现类

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接口
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;
    }

@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接口
public interface UserSocialCapitalEntity {
    Long getId();
    void setId(Long id);

    //

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

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

}
(2)entity实现类
@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)接口方法

    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;


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

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

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

分享给更多需要的同行。

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

  • 36
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的使用Spring Data JPA进行数据关联查询的示例: 假设我们有两个数据库,一个是用户数据库,另一个是订单数据库,它们都有一个共同的字段userId。现在我们想要关联查询用户和他们的订单信息,并且这些信息存储在不同的数据库中。 首先,我们需要在Spring Boot应用程序中配置两个数据源,并分别创建两个JPA Repositories: ```java @Configuration @EnableJpaRepositories(basePackages = "com.example.user.repository", entityManagerFactoryRef = "userEntityManagerFactory", transactionManagerRef = "userTransactionManager") public class UserDataSourceConfig { @Primary @Bean(name = "userDataSource") @ConfigurationProperties(prefix = "spring.datasource.user") public DataSource userDataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "userEntityManagerFactory") public LocalContainerEntityManagerFactoryBean userEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("userDataSource") DataSource dataSource) { return builder.dataSource(dataSource).packages("com.example.user.entity").persistenceUnit("user").build(); } @Primary @Bean(name = "userTransactionManager") public PlatformTransactionManager userTransactionManager(@Qualifier("userEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } } @Configuration @EnableJpaRepositories(basePackages = "com.example.order.repository", entityManagerFactoryRef = "orderEntityManagerFactory", transactionManagerRef = "orderTransactionManager") public class OrderDataSourceConfig { @Bean(name = "orderDataSource") @ConfigurationProperties(prefix = "spring.datasource.order") public DataSource orderDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "orderEntityManagerFactory") public LocalContainerEntityManagerFactoryBean orderEntityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("orderDataSource") DataSource dataSource) { return builder.dataSource(dataSource).packages("com.example.order.entity").persistenceUnit("order").build(); } @Bean(name = "orderTransactionManager") public PlatformTransactionManager orderTransactionManager(@Qualifier("orderEntityManagerFactory") EntityManagerFactory entityManagerFactory) { return new JpaTransactionManager(entityManagerFactory); } } @Repository public interface UserRepository extends JpaRepository<User, Long> { } @Repository public interface OrderRepository extends JpaRepository<Order, Long> { } ``` 然后,我们可以使用Spring Data JPA的@Query注解来编写关联查询的语句。例如,我们可以在OrderRepository中编写以下查询: ```java @Repository public interface OrderRepository extends JpaRepository<Order, Long> { @Query(value = "SELECT o.* FROM order_db.order o JOIN user_db.user u ON o.user_id = u.id WHERE u.name = ?1", nativeQuery = true) List<Order> findOrdersByUserName(String userName); } ``` 在这个查询中,我们使用了原生SQL语句,来跨数据关联查询用户和订单信息。 最后,我们可以在Controller中调用这个查询方法,并返回结果给客户端: ```java @RestController @RequestMapping("/orders") public class OrderController { @Autowired private OrderRepository orderRepository; @GetMapping("/by-user-name") public List<Order> getOrdersByUserName(@RequestParam String userName) { return orderRepository.findOrdersByUserName(userName); } } ``` 这样,我们就完成了使用Spring Data JPA进行数据关联查询的示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值