Hibernate 使用规范进行深度连接获取
我有实体A与实体B相关的1-1。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
实体B与实体C 1-1相关
- 用户实体
- 徽章实体
- 徽章类型
- 徽章实体
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);