【问题标题】:how to fetch data from two tables in JPA如何从 JPA 中的两个表中获取数据
【发布时间】:2019-01-30 06:33:07
【问题描述】:

我无法使用以下查询从两个表中获取所有记录

我已经尝试过了,但我只能从一张表中得到结果。我想要两个表的结果,即 client_software_param_mapping 和 client_file_configuration 具有相同的 ClientId,这是从第三个 pojo(client_software_configuration) 到第一个和第二个 pojo 的外键。

public Result showClientConfiguration() {EntityManagerFactory entityManagerFactory =                          Persistence.createEntityManagerFactory("defaultPU");
  EntityManager entityManager = entityManagerFactory.createEntityManager();

Query q=entityManager.
  createQuery("SELECT c FROM client_software_param_mapping c JOIN fetch client_file_configuration f ON c.ClientId=f.ClientId");
  List data =q.getResultList();
  return ok(Json.toJson(data));
}

第一个pojo

@Entity
public class client_file_configuration {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;

  private String sourceFolder;
  private String sourceFile;
  private String processingFolder;
  private String processingFile;
  private String processedFolder;
  private int intervalInMin;
  private String readAfterDelay;
  private String parserClass;
  private String directoryMode;
  private String fileMode;
  private String actionMode;
  private String type;
  private String fileExpressionResolver;

  @OneToOne
  @JoinColumn(name = "ClientId")

  private client_software_configuration clientSoftwareConfiguration;

  public client_software_configuration getClientSoftwareConfiguration() {
    return clientSoftwareConfiguration;
  }

  public void setClientSoftwareConfiguration(client_software_configuration clientSoftwareConfiguration) {
    this.clientSoftwareConfiguration = clientSoftwareConfiguration;
  }
}      

第二波乔

@Entity
public class client_software_param_mapping {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;

  private String paramKey;
  private String paramValue;


  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getParamKey() {
    return paramKey;
  }

  public void setParamKey(String paramKey) {
    this.paramKey = paramKey;
  }

  public String getParamValue() {
    return paramValue;
  }

  public void setParamValue(String paramValue) {
    this.paramValue = paramValue;
  }

  @ManyToOne
  @JoinColumn(name = "ClientId")

  private client_software_configuration clientSoftwareConfiguration;

  public client_software_configuration getClientSoftwareConfiguration() {
    return clientSoftwareConfiguration;
  }

  public void setClientSoftwareConfiguration(client_software_configuration clientSoftwareConfiguration) {
    this.clientSoftwareConfiguration = clientSoftwareConfiguration;
  }
}      

第三波乔

@Entity
public class client_software_configuration {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;

  private String url;
  private int port;
  private String endPoint;
  private String isPost;
  private String isPing;
  private String params;
  private int serialNo;

  private String dateFormat;
  private String token;
}

【问题讨论】:

  • 阅读有关 JPQL 的基本 JPA 文档。您使用 FETCH JOIN 在关系上而不是随机的其他类!
  • 加入不能仅使用外键。如果我使用的是主键,它可以工作,但我必须根据外键来做
  • 谁知道“不工作”是什么意思。也许如果你真的用事实更新你的问题
  • 请注意您说的是“SELECT c FROM client_software_param_mapping c...”,其中 c 是“client_software_param_mapping”表的别名。因此,您将只选择具有别名 c 的表。您需要从 c 和 f 中选择列。请看coderanch.com/t/688371/databases/…

标签: java mysql sql hibernate jpa


【解决方案1】:

这是正确的查询,因为它返回该 ClientId 处存在的第三个 pojo 的对象,因此它能够理解 ClientId 的类型。JPQL 从不使用表名和列名。它总是使用实体名称及其映射字段/属性名称。所以在这里我采用了具有 ClientId 字段的第三个 pojo 的对象。

select c,p from client_file_configuration c,client_software_param_mapping p where c.clientSoftwareConfiguration = p.clientSoftwareConfiguration

【讨论】:

    猜你喜欢
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 2014-05-16
    • 2019-02-19
    相关资源
    最近更新 更多