关于Spring-JPA框架下使用多表查询的应用实例记录

1.目的:记录如何 用jpa来实现快速的多表查询, 暂不深入探究jpa的内部实现

2. 说明情形:

@1所涉及的表为t_user(id,name,date,...);t_factory_user(id,factory_id,user_id,...), 其中表s_factory_user[user_id]==t_user[id], 为主外键的关联关系

@2现状  在entity类User中,  如下代码:

@OneToMany(mappedBy = "s_factory_user", fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
private FactoryUser fu = new FactoryUser();

  在entity类FactoryUser中, 如下代码:

@ManyToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH})
    @JoinColumn(name = "user_id")
    private User user;


添加代码后, 在启动项目后会报错, “org.hibernate.MappingException: Could not determine type for:”, 即为在不能在Use实体类中,定义属性fu(fu属性类型为factoryUser);

解决:在查询了相关文章后, “mappingexception”是指配置hibernate配置文件时错误或没有加载上hbm配置文件。现在该项目中用到的是jpa的注解方式来配置hibernate映射关系,还是我在属性的注解上有错误。 尝试直接在属性上添加属性@Transient, 加载依然报错,那么现在简单了解一下@OneToMany的使用;

@1.其中的mappedBy指的是关联类FactoryUser中的属性名user

@2. 在factoryUser类中,@JoinColumn中的name属性为‘userId’, 是对应的factoryUser的属性userId

则正常的应该为:

在factoryUser类中

private User user;

@OneToOne(cascade = {CascadeType.MERGE, CascadeType.REFRESH})
@JoinColumn(name = "userId")
    public User getUser() {
        return user;
    }

     在User类中

private FactoryUser fu;

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user")
    public FactoryUser getFu() {
        return fu;
}

ok, 这样项目可以正常启动了。

3.使用jpa的查询

@1 要集成接口类JpaSpecificationExecutor, 该类提供了几个方法

T findOne(Specification<T> spec);

List<T> findAll(Specification<T> spec);

Page<T> findAll(Specification<T> spec, Pageable pageable);

@2 具体的使用

<span>	</span>Specification<User> spec = new Specification<User>() {
            
            @Override
            public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                Predicate p1 = cb.equal(root.get("userCategory").as(Integer.class), 2);
                // 设置sql链接
                Join<User, FactoryUser> fuJoin = root.join(root.getModel().getSingularAttribute("fu", FactoryUser.class), JoinType.INNER);
                Predicate p2 = cb.equal(fuJoin.get("factoryId").as(Long.class), factoryIdFinal);
                query.where(cb.and(p1, p2));
                // 添加排序的功能
                query.orderBy(cb.desc(root.get("id").as(Long.class)));
                return query.getRestriction();
            }
        };
        return userDao.findAll(spec);
待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值