如何按教员姓名过滤?

问题描述 投票:1回答:1

我想在Primefaces DataTable(版本7)上实现懒惰记录加载。我有两个实体,一个叫Faculties,另一个叫Careers,它们是相关的。数据表正确地显示了所有种族的列表(包括分页和过滤),我的问题是,我不知道如何通过某个院系的名称来过滤种族,因为我不知道如何在当时留下的查询中包含连接。

你能指导我如何解决这个问题吗?

实体院系

public class Facultades implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idfacultad")
private Integer idfacultad;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 100)
@Column(name = "nombre")
private String nombre;
@Size(max = 20)
@Column(name = "abreviatura")
private String abreviatura;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idfacultad")
private List<Carreras> carrerasList;}

Entity Carreras

public class Carreras implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idcarrera")
private Integer idcarrera;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 150)
@Column(name = "nombre")
private String nombre;
@Basic(optional = false)
@NotNull
@Column(name = "tipo")
private int tipo;
@JoinColumn(name = "idfacultad", referencedColumnName = "idfacultad")
@ManyToOne(optional = false)
private Facultades idfacultad;}

查询 findByParams

public List<Carreras> findByParams(int start, int size, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
    CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
    CriteriaQuery<Carreras> criteriaQuery = criteriaBuilder.createQuery(Carreras.class);
    Root<Carreras> root = criteriaQuery.from(Carreras.class);
    CriteriaQuery<Carreras> select = criteriaQuery.select(root);

    Join<Carreras, Facultades> facultad = root.join("idfacultad");

    if (sortField != null) {
        criteriaQuery.orderBy(sortOrder == SortOrder.DESCENDING ? criteriaBuilder.asc(root.get(sortField)) : criteriaBuilder.desc(root.get(sortField)));
    }

    if (filters != null && filters.size() > 0) {
        List<Predicate> predicados = new ArrayList<>();

        filters.entrySet().forEach((entry) -> {
            String key = entry.getKey();
            Object val = entry.getValue();
            if (!(val == null)) {
                // Construimos la expresion con los predicados que si existan
                Expression<String> expresion = root.get(key).as(String.class);
                Predicate predicado = criteriaBuilder.like(criteriaBuilder.lower(expresion), "%" + val.toString().toLowerCase() + "%");
                predicados.add(predicado);
            }
        });
        if (predicados.size() > 0) {
            criteriaQuery.where(criteriaBuilder.and(predicados.toArray(new Predicate[predicados.size()])));
        }
    }
    // Creamos la consulta
    TypedQuery<Carreras> consulta = em.createQuery(select);
    consulta.setFirstResult(start);
    consulta.setMaxResults(size);

    return consulta.getResultList();

}
jpa criteria criteria-api
1个回答
0
投票

你需要手动检查过滤器的键是否等于 "Faculty"。Facultades 对象,并在这种情况下,在已经创建的连接表达式上创建一个谓词。

if (key.equals("Facultad")) {
        expresion = facultad.get("nombre").as(String.class);
} else {
        expresion = root.get(key).as(String.class);
}
© www.soinside.com 2019 - 2024. All rights reserved.