【问题标题】:JPA Join table with SELECTJPA 使用 SELECT 连接表
【发布时间】:2016-08-24 08:29:33
【问题描述】:

我有一个这样的 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_table 中的行(有多个 for name="")以及该名称的最大 created_date。

有没有办法在 JPQL 查询中复制它?

这里是Entity类的要点,很简单:

@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

}

【问题讨论】:

  • 你的课是?因为你知道 JPQL 是面向类/字段而不是表/列
  • 我确实知道。老实说,我对 jpa 还很陌生,而且我对 jpql 还不是很熟悉。实体类将是 myTable 并且我尝试加入的名称字段是一个字符串。或许这不是可以直接做的事情?
  • 也许我需要另一个只返回最大日期和名称字段的实体类?而不是尝试使用相同的实体

标签: java sql jpa join


【解决方案1】:

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

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

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

Query q = em.createQuery( "Your query in sql syntax as a string object" );

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

List<object> resultOfMyQuery = q.getResultList();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 2015-03-09
    相关资源
    最近更新 更多