Java 在选择期间休眠重复的行
几个月前,我用Hibernate 5开始了我的冒险。我正在创建一个Spring引导应用程序,它需要从数据库视图获取数据。 我已经创建了一个JPA实体,并编写了负责运行查询并将结果映射到ORM实体的代码。问题是Hibernate在跟踪中生成正确的查询,但返回第一行的副本作为列表。Hibernate创建的查询如下所示:Java 在选择期间休眠重复的行,java,hibernate,jpa,spring-boot,orm,Java,Hibernate,Jpa,Spring Boot,Orm,几个月前,我用Hibernate 5开始了我的冒险。我正在创建一个Spring引导应用程序,它需要从数据库视图获取数据。 我已经创建了一个JPA实体,并编写了负责运行查询并将结果映射到ORM实体的代码。问题是Hibernate在跟踪中生成正确的查询,但返回第一行的副本作为列表。Hibernate创建的查询如下所示: select revenuesum0_.revenueId as revenueI1_9_, revenuesum0_.amount as amount2_9_,
select
revenuesum0_.revenueId as revenueI1_9_,
revenuesum0_.amount as amount2_9_,
revenuesum0_.calculatedDate as calculat3_9_,
revenuesum0_.revenueCalculatedDateId as revenueC4_9_,
revenuesum0_.categoryName as category5_9_,
revenuesum0_.timeSpan as timeSpan6_9_,
revenuesum0_.title as title7_9_,
revenuesum0_.userId as userId8_9_
from
RevenueSummaryView revenuesum0_
where
revenuesum0_.userId=?;
package org.pbt.model.entity;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.time.LocalDate;
@Entity
@Table(name = "ExpenseSummaryView")
public class ExpenseSummaryView {
@Id
@Column(name = "expenseId")
private int id;
@Column(name = "expenseCalculatedDateId", nullable = false)
private int calculatedDateId;
@Column(name = "userId", nullable = false)
private int userId;
@Column(name = "title", nullable = false)
private String title;
@Column(name = "amount", nullable = false)
private double amount;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
@Column(name = "calculatedDate", nullable = false)
private LocalDate calculatedDate;
@Column(name = "categoryName", nullable = false)
private String categoryName;
@Column(name = "timeSpan", nullable = false)
private String timeSpan;
public int getId() {
return id;
}
public int getCalculatedDateId() {
return calculatedDateId;
}
public int getUserId() {
return userId;
}
public String getTitle() {
return title;
}
public double getAmount() {
return amount;
}
public LocalDate getCalculatedDate() {
return calculatedDate;
}
public String getCategoryName() {
return categoryName;
}
public String getTimeSpan() {
return timeSpan;
}
@Override
public String toString() {
return "{id:" + id + ", calculatedDateId:" + calculatedDateId + ", userId:" + userId + ", title:" + title + ", amount:" + amount + ", calculatedDate:" + calculatedDate.toString() + ", categoryName:" + categoryName + "}";
}
}
当我在DBeaver和MySQL控制台上运行它时,结果集是正确的。当我尝试使用Java JPA查询执行获取数据时,会出现问题。导致错误的代码如下所示:
package org.pbt.dao;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.pbt.HibernateUtil;
import org.pbt.model.entity.ExpenseSummaryView;
import org.pbt.model.filter.Filter;
import org.springframework.stereotype.Repository;
import javax.persistence.Query;
import java.util.List;
@Repository
public class ExpenseSummaryViewDAOImpl implements ExpenseSummaryViewDAO {
private SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
@Override
public List<ExpenseSummaryView> getFiltered(Filter filter) {
Session session = this.sessionFactory.openSession();
String hql = "FROM ExpenseSummaryView WHERE userId = :userId ";
if (filter.getStartDate() != null && filter.getEndDate() != null) {
hql += "AND calculatedDate BETWEEN :startDate AND :endDate ";
} else if (filter.getStartDate() != null) {
hql += "AND calculatedDate >= :startDate ";
} else if (filter.getEndDate() != null) {
hql += "AND calculatedDate <= :endDate ";
}
Query query = session.createQuery(hql);
query.setParameter("userId", filter.getUserId());
if (filter.getStartDate() != null && filter.getEndDate() != null) {
query.setParameter("startDate", filter.getStartDate());
query.setParameter("endDate", filter.getEndDate());
} else if (filter.getStartDate() != null) {
query.setParameter("startDate", filter.getStartDate());
} else if (filter.getEndDate() != null) {
query.setParameter("endDate", filter.getEndDate());
}
List<ExpenseSummaryView> expenseSummaryViews = (List<ExpenseSummaryView>) query.getResultList();
session.close();
return expenseSummaryViews;
}
}
值得一提的是,在非常类似的情况下,我使用hibernate在同一个应用程序中从同一个db上的另一个视图中获取行,它工作正常,但在上面的情况下它不工作
是否有人可以提供帮助?问题的原因是数据库中没有可用的真实ID,expenseId字段在DB中不是真实ID,更改后,源代码开始正常工作。您的代码和映射似乎是正确的。也许可以查看您的存储库配置?另一方面,您可以将setParameter部分优化为:
if(filter.getStartDate()!=null){query.setParameter(“startDate”,filter.getStartDate();}否则if(filter.getEndDate()!=null){query.setParameter(“endDate”,filter.getEndDate());}
Hi,造成问题的原因是数据库中没有可用的真实ID,expenseId字段在DB中不是真实ID,更改后,源代码开始正常工作。