0
私は以下を達成したいと思います。クエリがあり、実行してREST呼び出しで行を返したいと思います。 クエリを物理的なテーブルにマップしたくない場合、どうすればよいでしょうか? 私はSpring Boot 1.5.2を使用します。NamedQueryとエンティティマッピングなし
私は以下を達成したいと思います。クエリがあり、実行してREST呼び出しで行を返したいと思います。 クエリを物理的なテーブルにマップしたくない場合、どうすればよいでしょうか? 私はSpring Boot 1.5.2を使用します。NamedQueryとエンティティマッピングなし
いくつかの試して修正した後、私は以下の解決策を得ました。 POJOクラスを作成します。@Entity注釈はありません。 packageScan命令が見つからない場合は、追加する必要があります。
@Repository
@Transactional
public class IActivityReport1Repository {
@PersistenceContext
private EntityManager entityManager;
public List<ActivityReport1> getResults(String userLogin) {
Query query = entityManager.createNativeQuery(
"SELECT " +
"t.request_id as id, t.request_title as title " +
"FROM some_table t ", "ActivityReport1Mapping");
List<ActivityReport1> results = query.getResultList();
return results;
}
}
そして最後に、サービスのimplクラスリポジトリクラスを追加します。結果セットマッピング
@SqlResultSetMappings({
@SqlResultSetMapping(name = "ActivityReport1Mapping",
classes = {
@ConstructorResult(targetClass = ActivityReport1.class, columns = {
@ColumnResult(name = "id"),
@ColumnResult(name = "title")
})
})
})
を作成@Entityでアノテートされたクラスで
public class ActivityReport1 {
@Column
private BigInteger id;
@Column
private String title;
//Only getters
public ActivityReport1(BigInteger id,
String title){
this.id = id;
this.title = title;
}
。
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public class ActivityReport1ServiceImpl implements IActivityReport1Service {
private static final Logger _Logger = LoggerFactory.getLogger(ActivityReport1ServiceImpl.class);
@Autowired
private IActivityReport1Repository sessionFactory;
@Override
public List<ActivityReport1> runReport(String userLogin) {
List<ActivityReport1> reportRows = sessionFactory.getResults(userLogin);
return reportRows;
}
}
あなたは「適切なコンストラクタが見つかりませんでした」と直面した場合、これは、Java側では、Javaの型にDB型をマップできなかったことを意味します。 私の場合、IDをLongからBigIntegerに、Timestampをjava.util.dateに変更する必要がありました。
物理テーブルにクエリをマップしますか? – Priyamal
いいえ、これはテーブルのカップルの結果であるためマップされたクエリではなく、ビューを作成できましたが、この機会を掘り下げたいと思っていました。 – nomadus