JHipster - Insert in the database with the GET method

374 views Asked by At

I have to create an application with Jhipster but i never use it before.
When a user send a GET request to the address http://localhost:8080/api/newmesure/{mac-address}/{value}
I want to insert a new mesure in my database.

First i created 3 entity "Plantes", "Capteurs" and "Mesures" with this format :

Image here : https://i.stack.imgur.com/zJqia.png (I'm not allowed to post)

I activated the JPA Filtering to create a @Query to insert data in my database but i read that was not possible.

In /src/main/java/com/mycompany/myapp/web/rest/MesuresRessources.java :

/**
 * REST controller for managing {@link com.mycompany.myapp.domain.Mesures}.
 */
@RestController
@RequestMapping("/api")
public class MesuresResource {

    private final Logger log = LoggerFactory.getLogger(MesuresResource.class);

    private static final String ENTITY_NAME = "mesures";

    @Value("${jhipster.clientApp.name}")
    private String applicationName;

    private final MesuresService mesuresService;

    private final MesuresQueryService mesuresQueryService;

    public MesuresResource(MesuresService mesuresService, MesuresQueryService mesuresQueryService) {
        this.mesuresService = mesuresService;
        this.mesuresQueryService = mesuresQueryService;
    }


    @GetMapping("/newMesure/{mac}/{value}")
    public String newMesure(@PathVariable String mac,@PathVariable int value) {

      log.debug("Adresse MAC : "+mac);
      log.debug("Valeur : "+value);

      @Query("SELECT valeur FROM Mesures WHERE id = 1") //not working
      Mesures getValeur(); //not working

      return "Mesure ajoutée";

    }
}

In /src/main/java/com/mycompany/myapp/domain/Mesures.java :

/**
 * A Mesures.
 */
@Entity
@Table(name = "mesures")
public class Mesures implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "valeur")
    private Integer valeur;

    @ManyToOne(optional = false)
    @NotNull
    @JsonIgnoreProperties("macs")
    private Capteurs mac;

    // jhipster-needle-entity-add-field - JHipster will add fields here, do not remove
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Integer getValeur() {
        return valeur;
    }

    public Mesures valeur(Integer valeur) {
        this.valeur = valeur;
        return this;
    }

    public void setValeur(Integer valeur) {
        this.valeur = valeur;
    }

    public Capteurs getMac() {
        return mac;
    }

    public Mesures mac(Capteurs capteurs) {
        this.mac = capteurs;
        return this;
    }

    public void setMac(Capteurs capteurs) {
        this.mac = capteurs;
    }
    // jhipster-needle-entity-add-getters-setters - JHipster will add getters and setters here, do not remove

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof Mesures)) {
            return false;
        }
        return id != null && id.equals(((Mesures) o).id);
    }

    @Override
    public int hashCode() {
        return 31;
    }

    @Override
    public String toString() {
        return "Mesures{" +
            "id=" + getId() +
            ", valeur=" + getValeur() +
            "}";
    }
}

Louan

1

There are 1 answers

1
Gaël Marziou On BEST ANSWER

Learning java with JHipster is probably not a wise idea, it uses a very rich technology stack which might lose you unless you invest enough time to learn the basics.

There are many things wrong in your code and approach:

  • You can't use @Query annotation inside the body of method a of your REST controller, it must be used in your @Repository interface, this code can't compile. See https://www.baeldung.com/spring-data-jpa-query for a quick introduction
  • JPA filtering is not related to inserting into database
  • In HTTP/REST, GET method is supposed to be idempotent. For making changes in your database you should use POST or PUT methods. See What is idempotency in HTTP methods?
  • Your entity naming convention is not consistent: use singular for entity classes because each entity object represents one single instance of Mesure. Here you have Plantes (plural), Capteur (singular) and Mesures (plural). For table names, JHipster uses singular but plural is quite common too because a table holds many rows. Of course, this is just a convention and you or your team may decide to apply another (like a prefix for table names) but the key point is to be consistent.