我有两个实体类:
@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
答案 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,可以使此操作更容易且类型更安全。