2015-05-08 51 views
0

我对JPA和数据库一般都很陌生,我试图自己教导一些。我想知道是否可以将您检索特定实体的列表转换为地图。最终我想获得所有单独实体的地图列表。将JPA实体转换为地图

这是我得到的错误:

java.lang.ClassCastException: consultant.billing.entity.WorkEntry cannot be cast to java.util.Map 

下面是我的实体,我试图运行代码:

@Entity 
@Table(name = "work_entry") 
@XmlRootElement 
@NamedQueries({ 
@NamedQuery(name = "WorkEntry.findAll", query = "SELECT w FROM WorkEntry w"), 
@NamedQuery(name = "WorkEntry.findByWorkEntryId", query = "SELECT w FROM WorkEntry w WHERE w.workEntryId = :workEntryId"), 
@NamedQuery(name = "WorkEntry.findByDate", query = "SELECT w FROM WorkEntry w WHERE w.date = :date"), 
@NamedQuery(name = "WorkEntry.findByHoursWorked", query = "SELECT w FROM WorkEntry w WHERE w.hoursWorked = :hoursWorked")}) 
public class WorkEntry implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "work_entry_id") 
private Integer workEntryId; 
@Column(name = "date") 
@Temporal(TemporalType.DATE) 
private Date date; 
// @Max(value=?) @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation 
@Column(name = "hours_worked") 
private Double hoursWorked; 
@JoinColumn(name = "activity_id", referencedColumnName = "activity_id") 
@ManyToOne 
private Activity activityId; 
@JoinColumn(name = "customer_id", referencedColumnName = "customer_id") 
@ManyToOne 
private Customer customerId; 

public WorkEntry() { 
} 

public WorkEntry(Date date, Double hoursWorked, Customer customerId, Activity activityId) { 
    this.date = date; 
    this.hoursWorked = hoursWorked; 
    this.activityId = activityId; 
    this.customerId = customerId; 
} 


public WorkEntry(Integer workEntryId) { 
    this.workEntryId = workEntryId; 
} 

public Integer getWorkEntryId() { 
    return workEntryId; 
} 

public void setWorkEntryId(Integer workEntryId) { 
    this.workEntryId = workEntryId; 
} 

public Date getDate() { 
    return date; 
} 

public void setDate(Date date) { 
    this.date = date; 
} 

public Double getHoursWorked() { 
    return hoursWorked; 
} 

public void setHoursWorked(Double hoursWorked) { 
    this.hoursWorked = hoursWorked; 
} 

public Activity getActivityId() { 
    return activityId; 
} 

public void setActivityId(Activity activityId) { 
    this.activityId = activityId; 
} 

public Customer getCustomerId() { 
    return customerId; 
} 

public void setCustomerId(Customer customerId) { 
    this.customerId = customerId; 
} 

@Override 
public int hashCode() { 
    int hash = 0; 
    hash += (workEntryId != null ? workEntryId.hashCode() : 0); 
    return hash; 
} 

@Override 
public boolean equals(Object object) { 
    // TODO: Warning - this method won't work in the case the id fields are not set 
    if (!(object instanceof WorkEntry)) { 
     return false; 
    } 
    WorkEntry other = (WorkEntry) object; 
    if ((this.workEntryId == null && other.workEntryId != null) || (this.workEntryId != null && !this.workEntryId.equals(other.workEntryId))) { 
     return false; 
    } 
    return true; 
} 

@Override 
public String toString() { 
    return "consultant.billing.entity.WorkEntry[ workEntryId=" + workEntryId + " ]"; 
} 

}

@Entity 
@Table(name = "customer") 
@XmlRootElement 
@NamedQueries({ 
@NamedQuery(name = "Customer.findAll", query = "SELECT c FROM Customer c"), 
@NamedQuery(name = "Customer.findByCustomerId", query = "SELECT c FROM Customer c WHERE c.customerId = :customerId"), 
@NamedQuery(name = "Customer.findByFirstName", query = "SELECT c FROM Customer c WHERE c.firstName = :firstName"), 
@NamedQuery(name = "Customer.findByLastName", query = "SELECT c FROM Customer c WHERE c.lastName = :lastName"), 
@NamedQuery(name = "Customer.findByStreetAddress", query = "SELECT c FROM Customer c WHERE c.streetAddress = :streetAddress"), 
@NamedQuery(name = "Customer.findByCity", query = "SELECT c FROM Customer c WHERE c.city = :city"), 
@NamedQuery(name = "Customer.findByState", query = "SELECT c FROM Customer c WHERE c.state = :state"), 
@NamedQuery(name = "Customer.findByPostalCode", query = "SELECT c FROM Customer c WHERE c.postalCode = :postalCode"), 
@NamedQuery(name = "Customer.findByPhoneNumber", query = "SELECT c FROM Customer c WHERE c.phoneNumber = :phoneNumber"), 
@NamedQuery(name = "Customer.findByEmail", query = "SELECT c FROM Customer c WHERE c.email = :email")}) 
public class Customer implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "customer_id") 
private Integer customerId; 
@Size(max = 75) 
@Column(name = "first_name") 
private String firstName; 
@Size(max = 75) 
@Column(name = "last_name") 
private String lastName; 
@Size(max = 250) 
@Column(name = "street_address") 
private String streetAddress; 
@Size(max = 50) 
@Column(name = "city") 
private String city; 
@Size(max = 50) 
@Column(name = "state") 
private String state; 
@Size(max = 45) 
@Column(name = "postal_code") 
private String postalCode; 
@Size(max = 45) 
@Column(name = "phone_number") 
private String phoneNumber; 
// @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")//if the field contains email address consider using this annotation to enforce field validation 
@Size(max = 250) 
@Column(name = "email") 
private String email; 
@OneToMany(mappedBy = "customerId") 
private Collection<ExpenseEntry> expenseEntryCollection; 
@OneToMany(mappedBy = "customerId") 
private Collection<WorkEntry> workEntryCollection; 

代码我试图跑步:

public Customer() { 
} 

String customerId = request.getParameter("customerId"); 
      Customer customer = customerServ.find(Integer.parseInt(customerId)); 
      request.setAttribute("customer", customer); 

      String sDate = request.getParameter("sDate"); 
      Date parsedSDate = sdf.parse(sDate); 
      java.sql.Date sqlSDate = new java.sql.Date(parsedSDate.getTime()); 

      String eDate = request.getParameter("eDate"); 
      Date parsedEDate = sdf.parse(eDate); 
      java.sql.Date sqlEDate = new java.sql.Date(parsedEDate.getTime()); 

      List<Map> workDone = workServ.getWorkDoneByCustAndDate(Integer.parseInt(customerId), sqlSDate, sqlEDate); 
      List<Map> expenses = expenseEntServ.getExpenseForCustIdAndDate(Integer.parseInt(customerId), sqlSDate, sqlEDate); 

      List newInvoice = invoice.getInvoice(workDone,expenses); 

方法我用得到WorkEntry:

public List<Map> getWorkDoneByCustAndDate(int custId, Date sDate, Date eDate) { 
    String jpql = "SELECT w FROM WorkEntry w WHERE w.customerId.customerId = :customerId AND w.date BETWEEN :sDate AND :eDate"; 
    Query q = getEntityManager().createQuery(jpql); 
    q.setParameter("customerId", custId); 
    q.setParameter("sDate", sDate, TemporalType.DATE); 
    q.setParameter("eDate", eDate, TemporalType.DATE); 
    return q.getResultList(); 
} 
+0

错误是说这个方法正在返回一个'WorkEntry',但你试图把它变成一个'List '这没有意义。 –

+0

这是多个条目,我回来了。没有一个 – Jamie

+0

请显示'getWorkDoneByCustAndDate'的方法定义 –

回答

1

你可以这样做,但没有与JPA,您让您的工作条目列表后,您可以使用Java反射或更容易,使用的BeanUtils或JACKSON将任何Java Bean(在您的情况下,WorkEntry类)转换为Map。

你可以看到这个BeanUtils库的例子来实现这个目标。

beanUtils example

你得到你的列表后,您可以添加以下代码:

List<Map> yourList=new ArrayList<Map>(); 
    List<WorkEntry> list=q.getResultList(); 
    for(WorkEntry we:list){ 
     BeanMap map=new BeanMap(we); 
     yourList.add(map); 
    } 

希望它能帮助。

+0

因此,工作,我的下一个问题是每个地图显示像“activityId => consultant.billing.entity.Activity [activityId = 200] “,我如何从地图列表中提取”consultant.billing.entity.Activity [activityId = 200]“的值,我试图在record.get(”activityId“)。equals()中做if语句,但这似乎不起作用 – Jamie

+0

你能分享你的代码吗?你是否试图打印你的地图的每个值?我不知道我是否明白你想用你的地图列表做什么,但这是我的想法:

 'for(Map mapOfWorkEntry:listOfMaps){' 'System.out.println("Map:"+mapOfWorkEntry);' 'Activity act=(Activity)mapOfWorkEntry.get("activity");' 'System.out.println("Activity name:"+act.getActivityName()+"| Activity Id:"+act.getId());' 'Double hours=(Double)mapOfWorkEntry.get("hoursWorked");' 'System.out.println("Hours:"+hours);' } 

+0

基本上我试图这样做:'for(Map record:workDone){ if(record.get(“activityId”)。equals(10)){ nonBillableHours + = + Double.parseD ouble(record.get( “hoursWorked”)的toString()。);” – Jamie