1. Dependecies
- 
hibernate-orm-panache
 - 
resteasy
 - 
resteasy-jsonb
 - 
jdbc-derby
 - 
smallrye-graphql
 - 
smallrye-openapi
 
1.1. Testen
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>3.21.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-db</artifactId>
    <version>2.0.2</version>
    <scope>test</scope>
</dependency>
2. Start Methode
Über die Klasse die Annotation
- 
@ApplicationScoped
 
In der der Methode Init Parameter StartupEvent mit @Observes
3. Derby db ohne datasource.txt
4. Embedded Id
In der Klasse die, die Referenzen auf 2 Klassen hat (Assotiation Tabelle)
@EmbededId EmbededIdClass id;
Eigene Klasse für die Referenzen erstellen (EmbededIdClass)
- 
Implements Serializable
 - 
Über die Klasse @Embeddable
 - 
Die Referenzen mit @ManyToOne
 
Beim Post die Schlüssel der Referenzen und die Daten mitgeben (DTO, PathParam, JsonObject)
5. Sequence
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Name der Folge") @SequenceGenerator(name = "Name der Folge", initialValue = 1000)
6. Repositories mit Panache
- 
PanacheRepository<Entity>
 - 
PanacheRepositoryBase<Entity, Id> wenn der Schüssel etwas anderes als Long ist
 
7. Json
JsonObject jsonObject = Json.createObjectBuilder().add(name,value).build()
kann einem Json-Array hinzugefügt werden
7.1. Auslesen aus einem JsonObject
object.getString("name");
object.getInt("name");
7.2. Auslesen aus einem JsonArray
JsonArray array = jsonObject.getJsonArray("person");
array.asJsonObject().getString("firstName");
8. Route zurück geben
- 
Als Parameter @Context UriInfo uriInfo
 - 
UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder() .path(survey1.getId().toString());
 - 
Response.created(uriBuilder.build()).build();
 
9. GraphQL
9.1. GET
@GraphQlApi bei Resource
Methoden mit @Query("nameDerQuery")
Aufruf:
query customersLnFnId{
  allCustomers{
    id
    firstName
    lastName
  }
}
customersLnFnId = Name den man in der History sieht kann beliebig gewählt werden
9.1.1. Mit Parameter
Aufruf:
query customersLnFnId{
    getCustomer(id: 5){
        firstName
        lastName
    }
}
Resource Methode muss mit @Name("id") im Parameter stehen haben
Default Wert mit @DefaultValue("Mustermann")
Wenn die Methode ohne Parameter aufgerufen wird darf man keine runden Klammern schreiben
query customersLn{
    getCustomerByLastName{
        id
        firstName
        lastName
    }
}
9.2. POST
@Mutation("name") über Methode
Aufruf:
mutation addCustomer{
    createCsutomer(customer: {
        fn: "Max"
        ln: "Mustermann"
    })
    {
        id
    }
}
9.3. Delete
Wie bei Post nur wird eine Id mitgegeben statt ein Objekt
9.5. Sonstiges
| Bei einer Mutation Methode muss ein Wert zurück gegeben werden | 
| Bei Mutation Methoden braucht man kein @Name | 
9.6. Context
Kann Injected oder als Parameter mitgegeben werden
@Inject Context context;
Möglichkeiten wie bei UriInfo in REST
siehe "Route zürück geben"
9.7. Fehler
Fehler Klasse erstellen
@ErrorCode("price too high")
public class PriceTooHighException extends Exception {
    @Override
    public String getMessage() {
    return "Price too high";
    }
}
Bei der Methode muss throws PriceTooHighException dabei sein.
if(room.getPricePerDay().intValue() > 100){
    throw new PriceToHighException();
}
10. Date
10.1. Differenz zwischen zwei Daten
ChronoUnit.DAYS.between(dateFrom, dateTo);
10.2. Tage zu einem Datum hinzufügen/entfernen
LocalDate.now().plusDays(1);
LocalDate.now().minusDays(1);
11. CSV Einlesen
11.1. Zeilen lesen
Stream<String> lines = Files.lines(Paths.get(fileName));
11.2. Skip
this.ccno = lines.skip(2).findFirst().get().substring(6);
Bei Skip kann ein Fehler auftauchen (IllegalStateException: stream has already been operated upon or closed) dann muss die Datei erneut aufgemacht werden:
lines = Files.lines(Paths.get(fileName));
11.3. Daten Speichern
lines.forEach(line -> {
    String[] cols = line.split(";");
    Customer customer = new Customer(cols[0], cols[1], ccno);
});
12. Sonstige Tipps
- 
application.properties
 - 
ToString Methode in den Entitäts Klassen
 - 
@ApplicationScoped im Main und Repos
 - 
JoinColumn für Referenzen auf andere Klassen
 - 
Bei Rest Schnittstellen Responses zurück geben
 - 
Bei einem Post keine id mitgeben sonst bekommt den Fehler "detached entity passed to persist"
 - 
Methoden mit Berechnungen in Klassen
 - 
Wenn im application.properties
quarkus.http.root-path=/api
 
dann muss man bei Swagger und GraphQl /api hinzufügen