我有一个表,其中包含指向它的实体的条形码的字符串值.不幸的是,它不是外键,只是一个字符串,因此不存在映射.这使得连接操作变得困难.我想知道如何将这个对象连接到另一个没有定义关系的表.例如:
@Entity
@Table(name = "TblSample", schema = SCHEMA, catalog = CATALOG)
public class Sample {
@Id
@Column(name = "id", nullable = false)
private int id;
@Column(name = "barcodeEntity", nullable = false)
private String barcodeEntity;
@OneToOne
@JoinColumn(name = "barcodeContainer", nullable = false)
private Container container;
...
}
@Entity
@Table(name = "TblSoil", schema = SCHEMA, catalog = CATALOG)
public class Soil {
@Column(name = "barcode", nullable = false)
private String barcode;
@Column(name = "name", nullable = false)
private String name;
...
}
@Entity
@Table(name = "TblLeaf", schema = SCHEMA, catalog = CATALOG)
public class Leaf {
@Column(name = "barcode", nullable = false)
private String barcode;
@Column(name = "name", nullable = false)
private String name;
...
}
@Entity
@Table(name = "TblContainer", schema = SCHEMA, catalog = CATALOG)
public class Container {
@Column(name = "barcode", nullable = false)
private String barcode;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "location", nullable = false)
private String location;
...
}
因此,我想使用CriteriaQuery可以返回所有样本并加入它所取自的实体.我已经开始写它了,但是当我试图弄清楚如何去做时我就陷入了困境.在sql中它想要这样的东西:
SELECT TOP 100
sample.Id
, sample.barcodeEntity
, leaf.name
, soil.name
, sample.barcodeContainer
, container.name
, container.location
FROM TblSample sample
LEFT JOIN TblSoil leaf on
soil.barcode = sample.barcodeEntity
LEFT JOIN TblLeaf leaf on
leaf.barcode = sample.barcodeEntity
JOIN TblContainer container on
container.barcode = sample.barcodeContainer
我猜相关的jpa CriteriaQuery看起来像这样:
public void findSamples(Map filterCriteria) {
final CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
final CriteriaQuery query = builder.createQuery(SampleLocation.class);
final Root derivation = query.from(Sample.class);
// Note that the next two lines don't work
final Join joinOnLeaf = derivation.join(Sample_.barcodeEntity, JoinType.LEFT);
final Join joinOnSoil = derivation.join(Sample_.barcodeEntity, JoinType.LEFT);
final Join joinOnContainer = derivation.join(Sample_.barcodeContainer);
CompoundSelection cSelect =
builder.construct(SampleLocation.class, sample.Id, sample.entitybarcode, joinOnLeaf.get(Leaf_.name), joinOnLeaf.get(Soil_.name), sample.barcodeContainer, joinOnContainer.get(Container_.name), joinOnContainer.get(Container_.location));
query.select(cSelect);
TypedQuery typedQuery = entityManager.createQuery(query);
typedQuery.setMaxResults(100);
return typedQuery.getResults();
}
我有什么想法可以执行左连接操作?基于CriteriaQuery api,我无法弄清楚如何做到这一点.似乎应该存在的东西.