Hibernate CriteriaQuery如何查找具有两个条件的整数列表

时间:2018-09-07 06:51:43

标签: java sql hibernate jpa

我有两个实体类:

@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;

我想根据package.name和package.queue.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();
}

任何人都可以帮助我添加另一个,除了要确保该值必须来自另一个实体。

编辑:

所以在@Leviand提示之后,我是这样的:

        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 :(得分:1)

您需要在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 ));

答案 1 :(得分:1)

queue_id是该列的名称。您必须使用字段名称Queue,并且必须获取其id字段(queue)进行比较。

如果使用metamodel-generator,可以使此操作更容易且类型更安全。