web-dev-qa-db-ja.com

Spring Boot Controller内でSQLステートメントを実行する方法は?

私の春のブートコントローラークラス内でSQLステートメントを実行したいのですが、jpaリポジトリーでメソッドを定義する必要はありません。私が使いたいステートメントは

SELECT UUID();

このステートメントはデータベースに関連しており、特定のエンティティには関連付けられていません。

上記のステートメントを実行するための解決策を誰かが提供できるといいですね

  1. スプリングコントローラクラス
  2. jpaリポジトリ(推奨される場合)

更新

コントローラ:

@Autowired
JdbcTemplate jdbcTemplate;

@RequestMapping(value = "/UUID", method = RequestMethod.GET)
public ResponseEntity<String> getUUID() {
    String uuid = getUUID();
    return buildGuestResponse(uuid);
}

public String getUUID(){
    UUID uuid = (UUID)jdbcTemplate.queryForObject("select UUID()", UUID.class);
    return uuid.toString();
}
6
user2083529

コードでJdbcTemplateを使用できます。

構成クラスで必要となるBeanは次のとおりです。

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource)
{
    return new JdbcTemplate(dataSource);
}

クエリを実行するコードは次のとおりです。

@Autowired
private JdbcTemplate JdbcTemplate;

public String getUUID(){
    UUID uuid = (UUID)jdbcTemplate.queryForObject("select UUID()", UUID.class);
    return uuid.toString();
}

またはこのようになるかもしれません:-

public UUID getUUID(){
    UUID uuid = (UUID)jdbcTemplate.queryForObject("select UUID()", UUID.class);
    return uuid;
}
8
kakabali

これは一般に、 JEEアプリケーション のプレゼンテーションレイヤー(コントローラーまたはビュー)でSQLを実行する(永続性を実行する)にはアーキテクチャ的に悪い設計です。

最善のオプションは、サービスレイヤーが永続性レイヤーを呼び出してデータを取得、保存、または更新するときに、コントローラーがサービスレイヤーを使用するようにすることです。

いずれの場合も、 Spring Data JDBC を使用できます。何かのようなもの:

import org.springframework.jdbc.core.JdbcTemplate;

....
 UUID uuid = (UUID)jdbcTemplate.query("SELECT UUID()", UUID.class);
....
2
Victor Gubin

Springデータを使用してSpringフレームワークでこれを実行した方法の小さな例を紹介できます。

コントローラクラス:

@RestController
@RequestMapping("api/account")
public class AccountController {
  private AccountService accountService;

  @RequestMapping(
        method = RequestMethod.GET,
        produces = MediaType.APPLICATION_JSON_VALUE,
        path = "{id}"
  )
  public ResponseEntity getAccountId(@PathVariable("id") UUID id) {
    try {
        Account ac = accountService.findOne(id);
        return new ResponseEntity(ac, HttpStatus.OK);
    } catch (Exception ex) {
        return new ResponseEntity("Account not found.", HttpStatus.NOT_FOUND);
    }
}

この小さな例では、JpaRepositoryインターフェースを拡張するインターフェースであるAccountControllerとAccountServiceがあります。アカウントオブジェクトは、自己作成オブジェクトです。 JpaRepositoryインターフェースを使用すると、SQLステートメントを自分で作成する必要がなくなります。代わりに、有効なモデルオブジェクトと識別子(私の場合はUUID)を提供する必要があります。

以下は、Accountオブジェクトの小さな例です。

@Entity
public class Account {

  private @Id @GeneratedValue(generator = "uuid2") UUID id;
  private String firstName, lastName, description;

  private Account() {}

  public Account(String firstName, String lastName, String description) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.description = description;
  }
}  

Springデータの操作方法の例については、 website のクイックスタートガイドに従うことをお勧めします。

それが役に立てば幸い!

1
Saltz