Hibernate CriteriaQuery Как найти список целых чисел с двумя условиями - PullRequest
0 голосов
/ 07 сентября 2018

У меня два класса сущностей один:

@Table(name = "package")
public class Package {


    @Id
    @Column(name = "package_id", insertable = false, nullable = false)
    private Long packageId;

    @Column(name = "timestamp", nullable = false, updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date timestamp;

    @Column(name = "name", nullable = false)
    private String name;

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "queue_id",foreignKey=@ForeignKey(name = "package_queue_id_fk"))
    private Queue Queue;

@Column(name = "file_number", nullable = true)
private Integer fileNumber;

И

@Table(name = "queue")
public class Queue {

    @Id
    @Column(name = "queue_id", insertable = false, nullable = false)
    private Integer queue;

    @Column(name = "description", nullable = true)
    private String description;

    @Column(name = "name", nullable = false)
    private String name;

    @OneToMany(mappedBy = "Queue", fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.REFRESH })
    @MapKeyColumn(name = "package_id")
    private Set<Package> packages;

И я хотел бы найти Список номеров файлов в зависимости от имени.пакета и.пакета.queue_id

Итак, в настоящее время у меня есть только одно условие (имя), и оно выглядит так:

public List<Integer> getAllFileNumbers(String fileName, Integer queueId) {

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Integer> query = cb.createQuery(Integer.class);

    Root<Package> package = query.from(package.class);
    query.select(package.get("fileNumber")).where(cb.equal(package.get("name"), fileName));

    return em.createQuery(query).getResultList();
}

Любой желающий может помочь мне добавить еще один, в дополнение к тому, что значение должно быть от другого объекта.

Edit:

Итак, после @Leviand hint я сделал это так:

        Predicate filenamePred= cb.equal(package.get("name"), fileName);
        Predicate queueIdPred = cb.equal(package.get("queue_id"), queueId);

        query.select(package.get("fileNumber")).where(cb.and(filenamePred, queueIdPred ));

Я получил ошибку:

Caused by: java.lang.IllegalArgumentException: Unable to locate Attribute  with the the given name [queue_id] on this ManagedType 

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

queue_id - название столбца. Вы должны использовать имя поля, которое Queue, и вы должны получить его поле идентификатора (queue) для сравнения.

Это можно сделать проще и безопаснее при использовании метамодели-генератора.

0 голосов
/ 07 сентября 2018

Вам нужно добавить два предиката (вы можете записать все это встроенным, я делю, так что это более понятно) в условии or, например:

Predicate filename= cb.equal(package.get("name"), fileName);
Predicate queueId = cb.equal(package.get("queue"), queueId);

//then use them in a or condition
query.select(root).where(cb.and(filename, queueId ));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...