web-dev-qa-db-fra.com

comment exécuter des instructions SQL à l'intérieur du contrôleur de démarrage de printemps?

Je veux exécuter l'instruction SQL à l'intérieur de ma classe de contrôleur de démarrage à ressort sans définir aucune méthode dans le référentiel jpa. La déclaration que je veux utiliser est 

SELECT UUID();

Cette instruction est liée à la base de données et n'est pas associée à une entité particulière. 

Ce serait bien si quelqu'un pouvait fournir une solution pour l'exécution de la déclaration ci-dessus via

  1. classe de contrôleur de printemps
  2. référentiel jpa (si recommandé)

mettre à jour

manette:

@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();
}
5
user2083529

Vous pouvez utiliser JdbcTemplate dans votre code.

Le bean dont vous aurez besoin dans votre classe de configuration est: -

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

Et le code pour exécuter la requête est: -

@Autowired
private JdbcTemplate JdbcTemplate;

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

ou peut être comme ça: -

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

C'est généralement une mauvaise conception architecturale pour exécuter n'importe quel SQL (faire n'importe quelle persistance) sur la couche de présentation (contrôleur ou vue) dans applications JEE

La meilleure option est de faire en sorte que le contrôleur utilise la couche de service, lorsque la couche de service appelle la couche de persistance pour: obtenir, enregistrer ou mettre à jour des données. 

Dans tous les cas, vous pouvez utiliser Spring Data JDBC . Quelque chose comme:

import org.springframework.jdbc.core.JdbcTemplate;

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

Je pourrais vous donner un petit exemple de la manière dont j’ai réalisé cela dans le cadre printanier en utilisant des données de printemps.

La classe de contrôleur:

@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);
    }
}

Dans ce petit exemple, j'ai AccountController et AccountService, une interface qui étend l'interface JpaRepository. L'objet de compte est un objet créé par soi-même. En utilisant l'interface JpaRepository, vous n'aurez pas besoin d'écrire les instructions SQL vous-même. Au lieu de cela, vous devez fournir un objet de modèle valide et l'identificateur (dans mon cas, l'UUID).

Voici un petit exemple d'objet Compte:

@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;
  }
}  

Pour plus d'exemples sur la façon de travailler avec les données de printemps, je vous recommande de suivre le guide de démarrage rapide sur leur website .

J'espère que ça aide!

1
Saltz