Java 带有SELECT的JPA连接表

Java 带有SELECT的JPA连接表,java,sql,jpa,join,Java,Sql,Jpa,Join,我有这样一个SQL查询: SELECT h.name, h.created_date, tbl.* FROM my_table tbl LEFT JOIN (SELECT name, max(created_date) created_date FROM my_table GROUP BY name) h ON tbl.name = h.name; 它返回my_表中的行(名称为“”)以及该名称的最大创建日期 有没有办法在JPQL查询中复制这一点 以下是实体类的要点,非常简单: @

我有这样一个SQL查询:

SELECT h.name, h.created_date,  tbl.*
FROM my_table tbl
  LEFT JOIN
  (SELECT name, max(created_date) created_date FROM my_table GROUP BY name) h
  ON tbl.name = h.name;
它返回my_表中的行(名称为“”)以及该名称的最大创建日期

有没有办法在JPQL查询中复制这一点

以下是实体类的要点,非常简单:

@Entity
@Table(name = "MY_TABLE")
@XmlRootElement
public class MyTable implements Serializable {


  private BigDecimal tableId;
  private String name;
  private Date createdDate;

  // ...

  @Id
  @Basic(optional = false)
  @Column(name = "TABLE_ID")
  @GeneratedValue(generator = "TBL_ID_SEQ")
  public BigDecimal getTableId() {
    return tableId;
  }

  @Basic(optional = false)
  @Column(name = "NAME")
  public String getName() {
    return name;
  }

  @Basic(optional = false)
  @Column(name = "CREATED_DATE", insertable = false)
  @Temporal(TemporalType.TIMESTAMP)
  public Date getCreatedDate() {
    return createdDate;
  }

  // ... getters/setters

}

读了你的问题,我想你不需要另一个实体。JPA中的实体与SQL中的表相同。实体和表之间通常存在1:1的关系。您只需要知道如何使用JPQ调用查询。您需要一个实体管理器,它调用您的语句

EntityManagerFactory emf=Persistence.createEntityManagerFactory(“PersistenceUnit”);
EntityManager em=emf.createEntityManager();

您必须在pom文件或配置java文件中定义持久化单元。完成后,您可以继续编写如下代码:

SELECT h.name, h.created_date,  tbl.*
FROM my_table tbl
  LEFT JOIN
  (SELECT name, max(created_date) created_date FROM my_table GROUP BY name) h
  ON tbl.name = h.name;
Query q=em.createQuery(“以sql语法作为字符串对象的查询”);

关于您的实体和调用的查询,您将收到一个使用

List resultOfMyQuery=q.getResultList()


这只是一个简短的例子。但希望你能找到一些流行语;)

只要看看你的问题,我想你不需要另一个实体。JPA中的实体与SQL中的表相同。实体和表之间通常存在1:1的关系。您只需要知道如何使用JPQ调用查询。您需要一个实体管理器,它调用您的语句

EntityManagerFactory emf=Persistence.createEntityManagerFactory(“PersistenceUnit”);
EntityManager em=emf.createEntityManager();

您必须在pom文件或配置java文件中定义持久化单元。完成后,您可以继续编写如下代码:

SELECT h.name, h.created_date,  tbl.*
FROM my_table tbl
  LEFT JOIN
  (SELECT name, max(created_date) created_date FROM my_table GROUP BY name) h
  ON tbl.name = h.name;
Query q=em.createQuery(“以sql语法作为字符串对象的查询”);

关于您的实体和调用的查询,您将收到一个使用

List resultOfMyQuery=q.getResultList()


这只是一个简短的例子。但希望你能找到一些流行语;)

你的课程是什么?因为您知道JPQL是面向类/字段而不是表/列的,所以我知道这一点。老实说,我对jpa很陌生,而且我还不太熟悉jpql。实体类将是myTable,我试图连接的名称字段是字符串。也许这不是可以直接完成的事情?也许我需要另一个只返回max date和name字段的实体类?而不是尝试使用相同的实体和您的类?因为您知道JPQL是面向类/字段而不是表/列的,所以我知道这一点。老实说,我对jpa很陌生,而且我还不太熟悉jpql。实体类将是myTable,我试图连接的名称字段是字符串。也许这不是可以直接完成的事情?也许我需要另一个只返回max date和name字段的实体类?而不是尝试使用相同的实体