簡體   English   中英

jpa非管理實體

[英]jpa non managed entities

假設我必須觸發這樣的查詢:

Select primarykey, columnname, old_value, new_value from first_audit_log;

Select primarykey, columnname, old_value, new_value from second_audit_log;

Select primarykey, columnname, old_value, new_value from third_audit_log; ...so on

audit_log未作為JPA enity映射到任何類,我嚴格地不能為n*_audit_logs創建n個類。

使用本機查詢功能,我如何最好地將其映射到泛型類? 試圖選擇新功能,但不確定...因此任何幫助表示贊賞。

由於審計日志表共享相同的列,因此可以創建一個“統一”這些表並將單個Java類映射到該視圖的視圖。 我相信你可以,因為你不需要寫更新,我想。

作為替代方案,使用本機查詢將是一個不錯的選擇。

編輯

1)如果您的審核日志已經是視圖,則可以根據其他視圖創建視圖,如果您不想為每個視圖創建映射Java類。 只記得添加一個值為1的虛擬列,如果該行來自“第一個”審核日志,則為2如果它來自第二個,依此類推,這樣您就可以將它們分開。

2)為了使用本機查詢,假設您的持久性提供程序是Hibernate,您可以在此示例中執行以下操作:

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

Session sess = em.unwrap(Session.class); // <-- Use Hibernate-specific features
SQLQuery query = sess.createSQLQuery(
   "SELECT AVG(age) AS averageAge, AVG(salary) as averageSalary FROM persons");

query.setResultTransformer(Transformers.aliasToBean(MyResult.class));
MyResult result = (MyResult) query.list().get(0);

MyResult聲明如下:

public class MyResult {

    private BigDecimal averageAge;
    private BigDecimal averageSalary;

    public BigDecimal getAverageAge() {
        return averageAge;
    }
    public void setAverageAge(BigDecimal averageAge) {
        this.averageAge = averageAge;
    }
    public BigDecimal getAverageSalary() {
        return averageSalary;
    }
    public void setAverageSalary(BigDecimal averageSalary) {
        this.averageSalary = averageSalary;
    }

}

persons表是這樣的(MySQL語法):

CREATE TABLE `persons` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(255) NOT NULL,
  `lastname` varchar(255) NOT NULL,
  `age` int(11) NOT NULL,
  `salary` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);

您可以輕松地根據您的需求調整此示例,只需將personsMyResult替換為您想要的內容即可。

sql查詢中的別名會自動轉換為大寫,並以大寫形式查找setter作為結果org.hibernate.PropertyNotFoundException拋出異常。 任何建議將不勝感激。

例如,下面的語句是查找setter ID而不是Id / id(無法在類Data上找到ID的setter)

List<Data> result = entityManager.unwrap(Session.class) 
            .createSQLQuery("Select id as id from table") 
            .setParameter("day", date.getDayOfMonth()) 
            .setParameter("month", date.getMonthOfYear()) 
            .setParameter("year", date.getYear()) 
           .setResultTransformer(Transformers.aliasToBean(Data.class))
           .list();

class Data {
  Integer id;

  public Integer getId() {
    return id;
  }

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM