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();
}
victor.herrera

これは可能ですが、JPAではできません。作業エントリのリストを取得した後、Javaリフレクションまたはそれ以上の簡単な方法を使用できます。BeanUtilsまたはJACKSONを使用して、任意のJava Bean(この場合はWorkEntryクラス)をマップに変換します。

この目標を達成するためのBeanUtilsライブラリのこの例を見ることができます。

beanUtilsの例

リストを取得したら、次のコードを追加できます。

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

それが役に立てば幸い。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

既存のJPAエンティティをPicketLinkにマップする方法

分類Dev

TIMESTAMP列をZonedDateTime JPAエンティティプロパティにマップする方法

分類Dev

データベースルックアップをjpaエンティティにマッピングする

分類Dev

JPAで結合クエリを非エンティティークラスにマップする方法は?

分類Dev

エンティティjpaでVarchar列タイプを整数にマップする

分類Dev

JPA、マップのエンティティタイプの値を主キーに追加する方法

分類Dev

db-functionresultをjpaエンティティプロパティにマップします

分類Dev

Spring JPA-> ResultSetを存在しないエンティティにマップする

分類Dev

JPA-2つの@ManyToOneを同じ親エンティティにマップする方法

分類Dev

JPA:別のエンティティから1つのプロパティのみをマップする方法

分類Dev

Springでマップエントリをyamlからプロパティに変換する方法は?

分類Dev

Hibernate / JPAは、ネイティブクエリの結果を非エンティティ保持エンティティにマップします

分類Dev

同じJPAエンティティを他のJPAエンティティに複数回マッピングする

分類Dev

どのようにJPAやHibernateのを使用してJavaエンティティプロパティにMySQLのJSON列をマップするために -

分類Dev

Spring Data JPA-クエリ結果をエンティティクラスに変換する方法

分類Dev

IQueryableIEnumerableエンティティをリストに変換する

分類Dev

Android-UnicodeをHTMLエンティティに変換する

分類Dev

TSQLをLinqからエンティティに変換する

分類Dev

HTMLエンティティをPython絵文字に変換する

分類Dev

AndroidでHTMLエンティティを文字に変換する

分類Dev

実行時にJPAでエンティティのマッピングテーブル名を取得する方法

分類Dev

弱いエンティティをJPAでマッピングする

分類Dev

マッププロパティを持つエンティティに対するクエリを休止

分類Dev

同じタイプの複数のエンティティをマッピングするHibernate JPA

分類Dev

エンティティを子エンティティとともにDTOに変換する

分類Dev

Hibernate / JPA:エンティティを異なるデータベースにマッピングする

分類Dev

DTOを複数のエンティティにマップする方法は?

分類Dev

dtoを複雑なエンティティにマップする

分類Dev

Springでフォームをエンティティにマップする方法

Related 関連記事

  1. 1

    既存のJPAエンティティをPicketLinkにマップする方法

  2. 2

    TIMESTAMP列をZonedDateTime JPAエンティティプロパティにマップする方法

  3. 3

    データベースルックアップをjpaエンティティにマッピングする

  4. 4

    JPAで結合クエリを非エンティティークラスにマップする方法は?

  5. 5

    エンティティjpaでVarchar列タイプを整数にマップする

  6. 6

    JPA、マップのエンティティタイプの値を主キーに追加する方法

  7. 7

    db-functionresultをjpaエンティティプロパティにマップします

  8. 8

    Spring JPA-> ResultSetを存在しないエンティティにマップする

  9. 9

    JPA-2つの@ManyToOneを同じ親エンティティにマップする方法

  10. 10

    JPA:別のエンティティから1つのプロパティのみをマップする方法

  11. 11

    Springでマップエントリをyamlからプロパティに変換する方法は?

  12. 12

    Hibernate / JPAは、ネイティブクエリの結果を非エンティティ保持エンティティにマップします

  13. 13

    同じJPAエンティティを他のJPAエンティティに複数回マッピングする

  14. 14

    どのようにJPAやHibernateのを使用してJavaエンティティプロパティにMySQLのJSON列をマップするために -

  15. 15

    Spring Data JPA-クエリ結果をエンティティクラスに変換する方法

  16. 16

    IQueryableIEnumerableエンティティをリストに変換する

  17. 17

    Android-UnicodeをHTMLエンティティに変換する

  18. 18

    TSQLをLinqからエンティティに変換する

  19. 19

    HTMLエンティティをPython絵文字に変換する

  20. 20

    AndroidでHTMLエンティティを文字に変換する

  21. 21

    実行時にJPAでエンティティのマッピングテーブル名を取得する方法

  22. 22

    弱いエンティティをJPAでマッピングする

  23. 23

    マッププロパティを持つエンティティに対するクエリを休止

  24. 24

    同じタイプの複数のエンティティをマッピングするHibernate JPA

  25. 25

    エンティティを子エンティティとともにDTOに変換する

  26. 26

    Hibernate / JPA:エンティティを異なるデータベースにマッピングする

  27. 27

    DTOを複数のエンティティにマップする方法は?

  28. 28

    dtoを複雑なエンティティにマップする

  29. 29

    Springでフォームをエンティティにマップする方法

ホットタグ

アーカイブ