Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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中使用CriteriaBuilder获取列表时发生IllegalStateException_Java_Jpa_Criteria_Hibernate Criteria_Predicate - Fatal编程技术网

在Java中使用CriteriaBuilder获取列表时发生IllegalStateException

在Java中使用CriteriaBuilder获取列表时发生IllegalStateException,java,jpa,criteria,hibernate-criteria,predicate,Java,Jpa,Criteria,Hibernate Criteria,Predicate,总而言之,我有3个实体,主要的一个是名为“Rac”的实体。它包含一个“RacNatureza”列表,其中包含一个属性“Natureza” Rac 自然 @Entity @Table(name = "natureza") public class Natureza { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id_natureza") private Integ

总而言之,我有3个实体,主要的一个是名为“Rac”的实体。它包含一个“RacNatureza”列表,其中包含一个属性“Natureza”

Rac

自然

@Entity
@Table(name = "natureza")
public class Natureza {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_natureza")
    private Integer idNatureza;
    private String descricao;

    @OneToMany(mappedBy = "natureza", fetch = FetchType.EAGER, orphanRemoval = true)
    @JsonIgnore
    private List<RacNatureza> racNatureza;
}
@实体
@表(name=“natureza”)
公共类自然{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“id_natureza”)
私有整数idNatureza;
私有字符串描述符;
@OneToMany(mappedBy=“natureza”,fetch=FetchType.EAGER,orphan=true)
@杰索尼奥雷
私人名单;
}
我试图开发一个使用过滤器的搜索,在这种情况下,用户选择一个“Natureza”列表,然后,系统必须显示用户选择的Natureza包含哪些“Rac”。为此,我尝试使用Entitymanager和Criteriabuilder实现

我尝试过这样编写表达式,但不起作用(我没有使用元模型):

@PersistenceContext
私人实体管理者实体管理者;
@凌驾
公共列表筛选器(RacFilter RacFilter){
CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery criteria=builder.createQuery(Rac.class);
Root=标准源(Rac.class);
谓词[]谓词=criarricoes(racFilter、builder、root);
条件。where(谓词);
TypedQuery查询=entityManager.createQuery(条件);
返回query.getResultList();
}
@凌驾
公共谓词[]criarRestricoes(RacFilter、RacFilter、CriteriaBuilder、Root){
列表谓词=新的ArrayList();
if(racFilter.getNaturezas()!=null){
谓词.add(
builder.equal(root.get(“racNaturezas”).get(“natureza”)、racFilter.getNaturezas());
}   
返回谓词.toArray(新谓词[predicates.size()]);
}
因此,使用上面的代码,我收到了以下错误: 原因:java.lang.IllegalStateException:非法尝试取消引用基本类型的路径源[null.racNaturezas]

我相信错误在这一行,但我真的不知道如何修复它:

    predicates.add(
            builder.equal(root.<List<RacNatureza>>get("racNaturezas").<Natureza>get("natureza"), racFilter.getNaturezas()) );
}   
predicates.add(
builder.equal(root.get(“racNaturezas”).get(“natureza”)、racFilter.getNaturezas());
}   
替换
root.get(“racNaturezas”)
使用
root.join(“racNaturezas”)


请不要问我为什么我们不能使用
get

FWIW您不能使用
get
,因为隐式联接只指向多对一和一对一关联。它们不能用于多对多或一对多关联。在后一种情况下,需要显式联接,即
root.join(“racNaturezas”)

@Entity
@Table(name = "natureza")
public class Natureza {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_natureza")
    private Integer idNatureza;
    private String descricao;

    @OneToMany(mappedBy = "natureza", fetch = FetchType.EAGER, orphanRemoval = true)
    @JsonIgnore
    private List<RacNatureza> racNatureza;
}
@PersistenceContext
private EntityManager entityManager;

@Override
public List<Rac> filtrar(RacFilter racFilter) {
    CriteriaBuilder builder = entityManager.getCriteriaBuilder();
    CriteriaQuery<Rac> criteria = builder.createQuery(Rac.class);
    Root<Rac> root = criteria.from(Rac.class);

    Predicate[] predicates = criarRestricoes(racFilter, builder, root);
    criteria.where(predicates);

    TypedQuery<Rac> query = entityManager.createQuery(criteria);
    return query.getResultList();

}

@Override
public Predicate[] criarRestricoes(RacFilter racFilter, CriteriaBuilder builder, Root<Rac> root) {
    List<Predicate> predicates = new ArrayList<>();
    if (racFilter.getNaturezas() != null) {
        predicates.add(
                builder.equal(root.<List<RacNatureza>>get("racNaturezas").<Natureza>get("natureza"), racFilter.getNaturezas()) );
    }   
    return predicates.toArray(new Predicate[predicates.size()]);
}
    predicates.add(
            builder.equal(root.<List<RacNatureza>>get("racNaturezas").<Natureza>get("natureza"), racFilter.getNaturezas()) );
}