Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 使用规范进行深度连接获取_Hibernate_Jpa_Spring Data Jpa_Dsl_Criteria Api - Fatal编程技术网

Hibernate 使用规范进行深度连接获取

Hibernate 使用规范进行深度连接获取,hibernate,jpa,spring-data-jpa,dsl,criteria-api,Hibernate,Jpa,Spring Data Jpa,Dsl,Criteria Api,我有实体A与实体B相关的1-1。 实体B与实体C 1-1相关 用户实体 徽章实体 徽章类型 我希望使用规范实现复杂的过滤搜索。 此外,我将配置从UserEntity到BadgeEntity以及从BadgeEntity到BadgeTypeEntity的联接获取,以便在单个查询中检索具有“BadgeType”的UserEntity 在没有规范的情况下,直接使用CriteriaAPI,在需要的地方很容易解决配置所需的获取的问题 我首先尝试: 但似乎只能配置一个级别的抓取(UserEntit

我有实体A与实体B相关的1-1。
实体B与实体C 1-1相关

  • 用户实体
    • 徽章实体
      • 徽章类型
我希望使用规范实现复杂的过滤搜索。 此外,我将配置从UserEntity到BadgeEntity以及从BadgeEntity到BadgeTypeEntity的联接获取,以便在单个查询中检索具有“BadgeType”的UserEntity

在没有规范的情况下,直接使用CriteriaAPI,在需要的地方很容易解决配置所需的获取的问题

我首先尝试: 但似乎只能配置一个级别的抓取(UserEntity-->BadgeEntity)

因此,我尝试提供一个“伪”规范,只需将所需的连接获取添加到查询中,但我认为这是一个不好的解决方法

用户实体

public class UserEntity
{

   private String name;
   private String email;  

   @Fetch(FetchMode.JOIN)
   @OneToOne(fetch = FetchType.EAGER)
   @JoinColumn(name = "BADGE_ID")
   private BadgeEntity badge;

   ...
}
徽章实体

public class BadgeEntity
{

    @Fetch(FetchMode.JOIN)
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "BADGE_TYPE_ID")
    private BadgeTypeEntity badgeType;
  ...
}
public class BadgeTypeEntity
{

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "BADGE_TYPE_ID")
    private Integer badgeTypeId;

    @Column(name = "CODE")
    private String code;
}
徽章类型实体

public class BadgeEntity
{

    @Fetch(FetchMode.JOIN)
    @OneToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "BADGE_TYPE_ID")
    private BadgeTypeEntity badgeType;
  ...
}
public class BadgeTypeEntity
{

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "BADGE_TYPE_ID")
    private Integer badgeTypeId;

    @Column(name = "CODE")
    private String code;
}
电子邮件过滤器规格

public class UsersEmailSpec implements Specification<UserEntity>
{

    private String email;

    public UsersEmailSpec(String email)
    {
        this.email = email;
    }

    @Override
    public Predicate toPredicate(Root<UserEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder)
    {
        Predicate result = null;
        if(StringUtils.isNotEmpty(this.email))
        {
            result = criteriaBuilder.like(root.get(UserEntity_.email),this.email);
        }
        return result;
    }
}
public class UsersNameSpec implements Specification<UserEntity>
{

    private String name;

    public UsersNameSpec(String name)
    {
        this.name = name;
    }

    @Override
    public Predicate toPredicate(Root<UserEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder)
    {
        Predicate result = null;
        if(StringUtils.isNotEmpty(this.name))
        {
            result = criteriaBuilder.like(root.get(UserEntity_.name),this.name);
        }
        return result;
    }
}

有没有一种方法可以巧妙地使用规范来完成此问题?

您可以实现多级实体子映射

示例:

criteriaBuilder.like(root.get("badge").get("badgeType").get("email"),this.email);