Je l'ajouterai pendant mon temps libre
ProductForm.java
public class ProductForm {
//Propre classe
public ProductDto productDto;
}
L'erreur suivante peut se produire.
[InvalidPropertyException: Invalid property ◯◯ of bean class [△△Form]: Illegal attempt to get property '◯◯' threw exception; nested exception is org.springframework.beans.NullValueInNestedPathException: Invalid property '◯◯' of bean class [△△Form]: Could not instantiate property type [□□] to auto-grow nested property path: org.springframework.beans.BeanInstantiationException: Failed to instantiate [□□]: Is it an abstract class?; nested exception is java.lang.InstantiationException: □□]
Cela semble se produire si vous créez un constructeur avec des arguments sans faire de constructeur sans arguments. J'ai créé un constructeur vide et il a été corrigé.
ProductDto.java
public ProductDto() {
//ne fais rien
}
public ProductDto(Product product) {
this.price = product.price + "Cercle";
}
//Tous les cas
List<Product> products = Product.find.all();
//Entrez dans la liste
List<Product> products = Product.find.where().eq("valid_flg", 1).findList();
//Obtenir au format de pagination findPagedList(numéro de page,Nombre de pages par page)
PagedList<Product> products = Product.find.findPagedList(1, 20);
//Obtenir avec la clé primaire
Product product = Product.find.byId(1L);
//Obtenez le numéro
int count = Product.find.findRowCount();
//Acquérir une seule (* Une erreur se produira s'il y a deux ou plusieurs données applicables)
Product product = Product.find.where().eq("product_code", "123456789").findUnique();
Utilisez setDistinct (true)
.
List<Product> products = Product.find.select("category").setDistinct(true).findList();
// select distinct category from m_product;
Product.find.where().eq("Condition A")
.disjunction()
.add(Expr.eq("Condition B"))
.add(Expr.ilike("Condition C"))
.findList();
Défini dans la classe de modèle. Voici un exemple d'association de la table m_product et de la table m_season avec N: 1.
※ N:1 Un enregistrement pour une saison spécifique correspond toujours à un enregistrement pour un produit. Un produit n'est pas lié à plusieurs saisons. Pour un enregistrement particulier de la saison 1, plusieurs produits sont associés à cette saison. Par conséquent, la relation «produit: saison» est «N: 1». Expliquez les relations «un-à-un», «un-à-plusieurs» et «plusieurs-à-plusieurs» d'une manière simple à comprendre
models/Product.java
@ManyToOne
@JoinColumn(name = "season_id", insertable = false, updatable = false)
public Season season;
Définissez «@ ManyToOne» pour celui qui devient N. Définissez ensuite la clé externe sur le nom de @ JoinColumn
.
referencedColumnName
. En cas d'omission, la clé primaire est automatiquement spécifiée. (Comme il est omis dans cet exemple, il est joint par la colonne id de la table m_season.)models/Season.java
@OneToMany(mappedBy = "season")
public List<Product> productList;
Définissez «OneToMany» pour celui qui devient 1. mappedBy
correspond au nom de variable du champ défini par @ ManyToOne
.
Join
La jointure SQL est créée en passant le nom de variable de la relation définie ci-dessus à la méthode fetch
.
controllers/ProductListController
List<Product> products = Product.find
.fetch("season")
.findList();
// select * from m_product t0 left outer join m_season t1 on t1.id = t0.season_id;
@OneToOne
@ OneToMany
et @ ManyToOne
seront un chargement différé à moins que vous n'écriviez explicitement fetch, mais pour les relations un-à-un, ils seront chargés EAGER par défaut.
python
Product p = Product.find.byId(1);
// select * fron m_product t0 left outer join m_product_detail t1 on t0.product_id = t1.id where t1.id = 1;
//Lorsque les relations suivantes sont attachées au modèle de produit
// @OneToOne(mappedBy = "productDetail")
// public ProductDetail productDetail;
Joint même si fetch n'est pas écrit. Si vous ne souhaitez pas rejoindre, spécifiez explicitement le chargement différé.
models/Product.java
@OneToOne(mappedBy = "productDetail", fetch = FetchType.LAZY)
public ProductDetail productDetail;
Les numéros de série sont attribués comme t0, t1, t2 ... dans l'ordre d'apparition par défaut.
Vous pouvez définir n'importe quel alias en utilisant Query # alias
.
La table de destination de jointure ne peut pas être utilisée avec «Query # alias».
controllers/ProductListController
List<Product> products = Product.find
.query()
.alias("pro")
.fetch("season")
.findList();
// select * from m_product pro left outer join m_season t1 on t1.id = pro.season_id;
S'il existe une colonne portant le même nom dans la destination de la relation, spécifiez un alias pour faciliter la compréhension.
controllers/ProductListController
List<Product> products = Product.find
.query()
.alias("pro")
.orderBy("pro.valid_flg desc, pro.updated_at desc")
.fetch("season")
.findList();
// select * from m_product pro left outer join m_season t1 on t1.id = pro.season_id order by pro.valid_flg desc, pro.updated_at desc;
SampleController.java
session().get("hoge");
session ()
est une méthode de la classe play.mvc.Controller
, donc lors d'un appel depuis un autre contrôleur que le contrôleur, c'est comme suit.
Http.Context.current().session().get("hoge");
Récupérez la valeur définie à l'origine dans application.conf à partir de Java.
conf/application.conf
MAIL_ADDRESS = "[email protected]"
Sample.java
import com.typesafe.config.ConfigFactory;
String mailAddress = ConfigFactory.load().getString("MAIL_ADDRESS");
Vous pouvez créer un autre fichier sous conf et spécifier le nom du fichier.
conf/sample.conf
MAIL_ADDRESS = "[email protected]"
Sample.java
import com.typesafe.config.ConfigFactory;
String mailAddress = ConfigFactory.load(ConfigFactory.parseFileAnySyntax(new File("conf/sample.conf"))).getString("MAIL_ADDRESS");
Peut être appelé par injection de dépendances depuis Controller
SampleController.java
import Play.Configuration
@Inject Configuration configuration
String mailAddress = configuration.getString("MAIL_ADDRESS");
Par défaut, ʻapplication.conf` est chargé au démarrage. En spécifiant l'option de démarrage, vous pouvez modifier le fichier de paramètres à lire.
activator -Dconfig.file=conf/application_local.conf run
Si le fichier spécifié dans l'option n'est pas trouvé, ʻapplication.conf` est lu sans erreur.
Dans l'environnement de production, ʻactivator start est utilisé à la place de ʻactivator run
, il est donc nécessaire d'ajouter une habitude au style d'écriture.
activator "start 9000 -Dconfig.file=conf/application_prod.conf" -Dapplication.secret="xxxxxxxx"
activator -jvm-debug 9999 run
Au démarrage du serveur, faites un clic droit sur le dossier du projet dans Eclipse
Sélectionnez Debug
→Debug Configuration
.
Sélectionnez Application Java distante
dans le menu de gauche et sélectionnez
Entrez localhost
pour l'hôte et 9999
pour le port et appuyez sur Déboguer.
Cela s'arrêtera au point d'arrêt.
Si vous souhaitez ajouter un préfixe commun à toutes les routes, définissez-le dans application.conf.
conf/application.conf
application.context = "/admin"
localhost: 9000 / admin est la racine.
Recommended Posts