2013-03-05 85 views
4

比方说,我不得不解雇这样的查询:JPA非管理实体

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数量的创建n许多类*_audit_logs

使用本机查询功能,如何最好地将其映射到泛型类?尝试选择新功能,但不知道...因此,任何帮助表示赞赏。

+0

什么持久性提供您正在使用? Eclipselink有ResultType提示可能有助于http://www.eclipse.org/eclipselink/api/2.2/org/eclipse/persistence/config/ResultType.html – rootkit 2013-03-05 17:37:41

回答

3

由于您的审计日志表共享相同的列,因此您可以创建一个“统一”这些表并将单个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替换为您所需的值即可。

+0

否..auditlogs已经是视图...如何映射到通用类使用本机查询?...我想避免对象[]路径 – user1224036 2013-03-05 17:04:34

+0

任何建议? – user1224036 2013-03-05 17:18:44

+0

谢谢,我会看看 – user1224036 2013-03-05 17:35:05

1

sql查询中的别名会自动转换为大写,并以大写形式查找setter作为结果org.hibernate.PropertyNotFoundException抛出异常。任何建议将不胜感激。

例如,下面的语句是寻找二传手ID而不是D/I(找不到有关类数据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; 
    } 
} 
+1

使用“”为我工作的大小写敏感...我在以下链接中找到答案http://stackoverflow.com/questions/8136225/resulttransformer-with-createsqlquery-forces- no-camelcase-in-entity-fields – Minisha 2015-11-24 02:36:39

+0

我还有一个问题,在这行之后会发生什么事情:entityManager.unwrap(Session.class)?会议是否会自动关闭,或者我们必须明确关闭会议? – Minisha 2015-11-24 08:56:51