JPAネイティブクエリを使用してデータベースから抽出された結果にマップできるクラスを作成したいと考えています。基礎となるテーブルのないエンティティを結果にマップする方法はありますか?これ休止状態を可能にするリンク。代わりに JPA を使用してこれを行うことはできますか?
これは結果をマッピングするクラスです。
import java.math.BigDecimal;
import javax.persistence.Entity;
@Entity
public class OpUsage {
String username;
BigDecimal number_of_clicks;
String accordion;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public BigDecimal getNumber_of_clicks() {
return number_of_clicks;
}
public void setNumber_of_clicks(BigDecimal number_of_clicks) {
this.number_of_clicks = number_of_clicks;
}
public String getAccordion() {
return accordion;
}
public void setAccordion(String accordion) {
this.accordion = accordion;
}
}
ベストアンサー1
JPA 2.1仕様ネイティブクエリの結果を非エンティティクラスに返す手段を定義します
見出しを確認してください3.10.16.2 管理されていないインスタンスを返す特に
3.10.16.2.2 コンストラクターの結果
コンストラクタへのマッピングは、コンストラクタ結果注釈要素のSqlResultSet マッピング注釈。ターゲットクラスの要素コンストラクタ結果アノテーションは、指定された列に対応するコンストラクタを持つクラスを指定します。意図したコンストラクタの引数に対応するすべての列は、コンストラクタ結果コンストラクターの引数リストと同じ順序でアノテーションを追加します。コンストラクターの結果として返されるエンティティは、構築されたオブジェクトの主キーが取得されるかどうかに応じて、新規またはデタッチされた状態になります。
例
Query q = em.createNativeQuery(
"SELECT c.id, c.name, COUNT(o) as orderCount, AVG(o.price) AS
avgOrder" +
"FROM Customer c, Orders o " +
"WHERE o.cid = c.id " +
"GROUP BY c.id, c.name",
"CustomerDetailsResult");
@SqlResultSetMapping(name = "CustomerDetailsResult",
classes = {
@ConstructorResult(targetClass = com.acme.CustomerDetails.class,
columns = {
@ColumnResult(name = "id"),
@ColumnResult(name = "name"),
@ColumnResult(name = "orderCount"),
@ColumnResult(name = "avgOrder", type = Double.class)})
})