「spring for java や、seasar2 では、 EntityManager.find(~) や、select().id(~) で、Entityを検索できますが、 これらは、idの型や名称と、どうやって把握しているのだろう?」と思い、調べてみた。
当初、javax.persistence.EntityManager.java の method を辿ればよいと、思っていましたが、 MUserEntity.class.getFields() と Field.getAnnotations() で取得できるみたい。
package jp.end0tknr; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.sql.Timestamp; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.data.jpa.repository.support.JpaEntityInformationSupport; import org.springframework.data.repository.core.EntityInformation; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class MyController { @Autowired UserMstService userMstService; @Autowired MessageSource messageSource; @Autowired ItemNameProp itemNameProp; @PersistenceContext EntityManager entityManager; @RequestMapping(value="/index4") public String index4(Model model) { System.out.println("START index4"); // entityクラスのfield一覧から、@Id 情報を取得 Field[] fields1 = MUserEntity.class.getFields(); for (Field field1 : fields1) { System.out.println( field1 ); Annotation[] annots1 = field1.getAnnotations(); for (Annotation annot1 : annots1) { System.out.println( annot1 ); } } // 一方、EntityInformation では、@Id の型は取得できるが // @Id の名称は取得できない EntityInformation entityInformation1 = JpaEntityInformationSupport.getEntityInformation( MUserEntity.class, entityManager); System.out.println( entityInformation1.getIdType() ); System.out.println( entityInformation1.getJavaType() ); // EntityManger による 検索例 1 MUserEntity mUserEntity = entityManager.find( MUserEntity.class, "user@co.jp"); System.out.println(mUserEntity); // EntityManger による 検索例 2 - pkeyが複数 UserMstEntityPkey userMstEntityPkey = new UserMstEntityPkey(); userMstEntityPkey.setUserSmileid("end0tknr1"); userMstEntityPkey.setKyotenId(1); UserMstEntity userMstEntity = entityManager.find( UserMstEntity.class, userMstEntityPkey); System.out.println(userMstEntity); return "index"; } }
↑こう書くと、↓こうeclipseのコンソールに表示されます。
START index4 public java.lang.String jp.end0tknr.MUserEntity.userId @javax.persistence.Id() @javax.persistence.Column(nullable=true, precision=0, unique=false, name=user_id, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true) public java.lang.String jp.end0tknr.MUserEntity.password @javax.persistence.Column(nullable=true, precision=0, unique=false, name=password, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true) public java.lang.String jp.end0tknr.MUserEntity.userName @javax.persistence.Column(nullable=true, precision=0, unique=false, name=user_name, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true) public java.lang.String jp.end0tknr.MUserEntity.birthday @javax.persistence.Column(nullable=true, precision=0, unique=false, name=birthday, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true) public java.lang.Integer jp.end0tknr.MUserEntity.age @javax.persistence.Column(nullable=true, precision=0, unique=false, name=age, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true) public java.lang.Integer jp.end0tknr.MUserEntity.gender @javax.persistence.Column(nullable=true, precision=0, unique=false, name=gender, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true) public java.lang.Integer jp.end0tknr.MUserEntity.departmentId @javax.persistence.Column(nullable=true, precision=0, unique=false, name=department_id, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true) public java.lang.String jp.end0tknr.MUserEntity.role @javax.persistence.Column(nullable=true, precision=0, unique=false, name=role, length=255, scale=0, updatable=true, columnDefinition=, table=, insertable=true) class java.lang.String class jp.end0tknr.MUserEntity MUserEntity(userId=user@co.jp, password=$2a$10$rJyapIrvsHARwCNgporWLO6QIKXXezOpRrdb..7X0ea0VwZ5IldSy, userName=ユーザー1, birthday=2000-01-01, age=21, gender=2, departmentId=2, role=ROLE_GENERAL) UserMstEntity(kyotenId=1, regXmileid=end0tknr1, regName=end0tknr1, regDate=2021-05-12 00:00:00.0, lastUpdXmileid=end0tknr1, lastUpdName=end0tknr1, lastUpdDate=2021-05-12 00:00:00.0, isDelete=0, version=1, userXmileid=end0tknr1, userName=end0tknr, userShozokugroup=jp, shokumuId=freelance, subShokumuId1=null, subShokumuId2=null, subShokumuId3=null, subShokumuId4=null, isBoss=null, isFirstclassArchitect=null, isSecondclassArchitect=null, isMokuzouArchitect=null, architectTourokuNo=null, architectTourokuTodoufuken=null, architectKoushuuDate=null, kouzouArchitectKoufuNo=null, setsubiArchitectKoufuNo=null, sexyKoushuuDate=null, architectJimushoCode=null, architectJimushoCode2=null, architectJimushoCode3=null, architectJimushoCode4=null, architectJimushoCode5=null, architectJimushoCode6=null, architectJimushoCode7=null, architectJimushoCode8=null, architectJimushoCode9=null, architectJimushoCode10=null, smashCode=smash)