java - CriteriaQuery 加入字符串值

标签 java sql database jpa

我有一个表,其中包含它指向的实体的条形码的字符串值。不幸的是,它不是外键,它只是一个字符串,因此不存在映射。这使得连接操作变得困难。我想知道如何将这个对象连接到另一个没有定义关系的表。例如:

@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<String, String> filterCriteria) {
    final CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
    final CriteriaQuery<SampleLocation> query = builder.createQuery(SampleLocation.class);
    final Root<Sample> derivation = query.from(Sample.class);
    // Note that the next two lines don't work 
    final Join<Leaf> joinOnLeaf = derivation.join(Sample_.barcodeEntity, JoinType.LEFT);
    final Join<Soil> joinOnSoil = derivation.join(Sample_.barcodeEntity, JoinType.LEFT);
    final Join<Container> joinOnContainer = derivation.join(Sample_.barcodeContainer);

    CompoundSelection<SampleLocation> 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<SampleLocation> typedQuery = entityManager.createQuery(query);
    typedQuery.setMaxResults(100);

    return typedQuery.getResults();
}

关于如何执行左连接操作的任何想法?我无法根据 CriteriaQuery api 弄清楚如何去做。似乎是应该存在的东西。

最佳答案

我建议两个查询。对于第一个,获取与您的条形码字符串一致的主键值。然后在第二个查询中使用第一个查询中的数据。

关于java - CriteriaQuery 加入字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15068373/

相关文章:

java - 如何通过 getName().endsWith() 使用 FileFilter 的方法引用

java - java : constructor in class cannot be applied to given types

sql - 超过8000个字符时如何使用print语句

sql - mysql - 按一天中的小时搜索时间戳

javascript - 当用户键入一个字母时,如何使用 ajax 自动完成来显示来自 MySQL 数据库的值

java - 具有不可预测的外部依赖性的单元测试代码

java - 通过在postgresql的where查询中传递%来过滤数据

mysql - 显示数据库中每个发票项目的税费

java - 使用 JOIN 语句防止 SQL 查询中重复 ID

mysql - MySQL 中的长文本类型字段中是否存储任何类型(整数、文本、日期)?