2017-08-05 8 views
0

私は以下を達成したいと思います。クエリがあり、実行してREST呼び出しで行を返したいと思います。 クエリを物理的なテーブルにマップしたくない場合、どうすればよいでしょうか? 私はSpring Boot 1.5.2を使用します。NamedQueryとエンティティマッピングなし

+0

物理テーブルにクエリをマップしますか? – Priyamal

+0

いいえ、これはテーブルのカップルの結果であるためマップされたクエリではなく、ビューを作成できましたが、この機会を掘り下げたいと思っていました。 – nomadus

答えて

0

いくつかの試して修正した後、私は以下の解決策を得ました。 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に変更する必要がありました。

関連する問題