Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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
Java Spring JPA在关节表上使用规范和标准查询_Java_Mysql_Spring_Hibernate_Spring Data Jpa - Fatal编程技术网

Java Spring JPA在关节表上使用规范和标准查询

Java Spring JPA在关节表上使用规范和标准查询,java,mysql,spring,hibernate,spring-data-jpa,Java,Mysql,Spring,Hibernate,Spring Data Jpa,我使用JPA规范和CriteriaQuery将where子句添加到实体中 域类: public class Domain { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(name = "account_id") private Long accountId; @OneToMany(cascade = Cascad

我使用JPA规范和CriteriaQuery将where子句添加到实体中

域类:

public class Domain {

  @Id
  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  @Column(name = "account_id")
  private Long accountId;

  @OneToMany(cascade = CascadeType.ALL)
  @JoinColumn(name = "domain_id")
  private List<Notification> notification;
}
然后,我使用以下类创建规范:

public class DomainSpecification implements Specification<Domain> {

  final private SearchCriteria criteria;

  public DomainSpecification(SearchCriteria searchCriteria) {
    this.criteria = searchCriteria;
  }

  @Override
  public Predicate toPredicate(
          Root<Domain> root, CriteriaQuery<?> query, CriteriaBuilder builder) {

     switch (criteria.getOperation()) {
      case ":":
        if (root.get(criteria.getKey()).getJavaType() == String.class) {
          return builder.like(
                  root.<String>get(criteria.getKey()),
                  "%" + criteria.getValue() + "%");
        } else {
          return builder.equal(root.get(criteria.getKey()),
                  criteria.getValue());
        }
      case "=":
        return builder.equal(root.get(criteria.getKey()),
                criteria.getValue());
      default:
        return null;
    }
  }

}
然后,每当我想创建where子句时,我都会执行以下操作:

DomainSpecification idSpecification
        = new DomainSpecification(
                new SearchCriteria("id", "=", domainId));

Specifications<Domain> specifications = Specifications.where(idSpecification);

final Domain domain = this.domainRepository.findOne(specifications);
DomainSpecification ID规范
=新域规范(
新的搜索条件(“id”,“=”,domainId));
规格规格=规格。其中(idSpecification);
最终域=this.domainRepository.findOne(规范);
这将通过域实体中名为
id
的字段进行搜索

现在,我怎样才能根据我加入的实体进行筛选?例如,我想筛选Domain.id=10和Notification.contact=“abc”的位置


感谢您的帮助

您可以将
规范
的定义包装到helper类中:

public class DelegationSpecificationsHelper {

    public static Specification<Domain> notificationContactSpec(String contact) {
        return (root, query, cb) -> cb.equal(root.join("notification").get("contact"), contact);
    }

    public static Specification<Domain> idSpec(SearchCriteria searchCriteria) {
        switch (criteria.getOperation()) {
          case ":":
            if (root.get(criteria.getKey()).getJavaType() == String.class) {
              return builder.like(
                      root.<String>get(criteria.getKey()),
                      "%" + criteria.getValue() + "%");
            } else {
              return builder.equal(root.get(criteria.getKey()),
                      criteria.getValue());
            }
          case "=":
            return builder.equal(root.get(criteria.getKey()),
                    criteria.getValue());
          default:
            return null;
        }
    }
}
有关元模型生成的详细信息:

成功了!!感谢MATCOOL:考虑使用元模型生成器,这是非常有用的工具同意!再次感谢
DomainSpecification idSpecification
        = new DomainSpecification(
                new SearchCriteria("id", "=", domainId));

Specifications<Domain> specifications = Specifications.where(idSpecification);

final Domain domain = this.domainRepository.findOne(specifications);
public class DelegationSpecificationsHelper {

    public static Specification<Domain> notificationContactSpec(String contact) {
        return (root, query, cb) -> cb.equal(root.join("notification").get("contact"), contact);
    }

    public static Specification<Domain> idSpec(SearchCriteria searchCriteria) {
        switch (criteria.getOperation()) {
          case ":":
            if (root.get(criteria.getKey()).getJavaType() == String.class) {
              return builder.like(
                      root.<String>get(criteria.getKey()),
                      "%" + criteria.getValue() + "%");
            } else {
              return builder.equal(root.get(criteria.getKey()),
                      criteria.getValue());
            }
          case "=":
            return builder.equal(root.get(criteria.getKey()),
                    criteria.getValue());
          default:
            return null;
        }
    }
}
Specifications<Domain> specifications = Specifications.where(DelegationSpecificationsHelper.idSpec(new SearchCriteria("id", "=", domainId))
                                                      .and(DelegationSpecificationsHelper.notificationContactSpec("someSearchString"));
SearchCriteria idCriteria = new SearchCriteria("id", "=", domainId)
Specifications<Domain> specifications = 
                 Specifications.where(idSpec(idCriteria)
                               .and(notificationContactSpec("someSearchString"));
 public static Specification<Domain> notificationContactSpec(String contactValue) {
        return (root, query, cb) -> cb.equal(root.join(Domain_.notification).get(Notification_.contact), contactValue);
 }