{"id":108,"date":"2024-10-30T17:39:34","date_gmt":"2024-10-30T09:39:34","guid":{"rendered":"https:\/\/zhoujibin.com\/?p=108"},"modified":"2024-10-30T17:40:22","modified_gmt":"2024-10-30T09:40:22","slug":"jpa%e7%9a%84%e7%ae%80%e5%8d%95%e4%bd%bf%e7%94%a8","status":"publish","type":"post","link":"https:\/\/zhoujibin.com\/?p=108","title":{"rendered":"JPA\u7684\u7b80\u5355\u4f7f\u7528"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">\u7b80\u4ecb<\/h1>\n\n\n\n<pre class=\"wp-block-code\"><code>JPA\u662fJava Persistence API\u7684\u7b80\u79f0\uff0c\u4e2d\u6587\u540dJava\u6301\u4e45\u5c42API\uff0c\u662fJDK 5.0\u6ce8\u89e3\u6216XML\u63cf\u8ff0\u5bf9\u8c61\uff0d\u5173\u7cfb\u8868\u7684\u6620\u5c04\u5173\u7cfb\uff0c\u5e76\u5c06\u8fd0\u884c\u671f\u7684\u5b9e\u4f53&#91;\u5bf9\u8c61\u6301\u4e45\u5316](https:\/\/baike.baidu.com\/item\/\u5bf9\u8c61\u6301\u4e45\u5316\/7316192)\u5230\u6570\u636e\u5e93\u4e2d\u3002 \uff08&#91;\u6765\u6e90\uff1a\u767e\u5ea6\u767e\u79d1](https:\/\/baike.baidu.com\/item\/JPA\/5660672)\uff09\u3002\u603b\u7ed3\u4e00\u70b9\u5c31\u662f\u5bf9\u4e8e\u7b80\u5355\u7684CRUD\uff0c\u53ea\u9700\u8981\u64cd\u4f5c\u5bf9\u5e94\u7684\u5b9e\u4f53\u7c7b\uff0c\u65e0\u9700\u7f16\u5199SQL\u5373\u53ef\u5b9e\u73b0\u5bf9\u5e94\u7684\u529f\u80fd\uff0c\u540c\u65f6\u4e5f\u652f\u6301\u81ea\u5b9a\u4e49SQL\uff0c\u8be6\u60c5\u53ef\u67e5\u770b&#91;JPA\u5b98\u65b9\u64cd\u4f5c\u624b\u518c](https:\/\/docs.spring.io\/spring-data\/jpa\/docs\/current\/reference\/html\/#)\u3002<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">\u7248\u672c\u4ecb\u7ecd<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>\u7248\u672c<\/th><th>\u5907\u6ce8<\/th><\/tr><\/thead><tbody><tr><td>SpringBoot<\/td><td>2.6.4<\/td><td><\/td><\/tr><tr><td>MySQL<\/td><td>5.6.51<\/td><td><\/td><\/tr><tr><td>p6spy<\/td><td>3.9.1<\/td><td>\u7528\u4e8e\u683c\u5f0f\u5316sql\u6587\u4ef6\uff0c\u53ef\u4ee5\u5c06\u5360\u4f4d\u7b26\u76f4\u63a5\u66ff\u6362\u6210\u53c2\u6570\u503c\uff0c\u5c06\u6267\u884csql\u76f4\u63a5\u6253\u5370\u51fa\u6765<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">\u51c6\u5907\u5de5\u4f5c<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u6d4b\u8bd5\u8868\u76f8\u5173SQL<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u7528\u6237\u8868<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>DROP TABLE IF EXISTS `user`;\nCREATE TABLE `user`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '\u4e3b\u952eid',\n  `account` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '\u8d26\u6237\u540d',\n  `password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '\u5bc6\u7801',\n  `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '\u540d\u79f0',\n  `gender` int(1) NULL DEFAULT NULL COMMENT '\u6027\u522b',\n  `age` int(3) NULL DEFAULT NULL COMMENT '\u5e74\u9f84',\n  `create_user` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '\u521b\u5efa\u4eba',\n  `create_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '\u521b\u5efa\u65f6\u95f4',\n  `update_user` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '\u66f4\u65b0\u4eba',\n  `update_time` timestamp(6) NOT NULL DEFAULT '0000-00-00 00:00:00.000000' COMMENT '\u66f4\u65b0\u65f6\u95f4',\n  `delete_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '\u5220\u9664\u6807\u8bc6',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '\u7528\u6237\u8868' ROW_FORMAT = Compact;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u7528\u6237\u673a\u6784\u8868<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>DROP TABLE IF EXISTS `user_org`;\nCREATE TABLE `user_org`  (\n  `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '\u4e3b\u952eid',\n  `user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '\u7528\u6237id',\n  `org_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '\u673a\u6784\u4ee3\u7801',\n  `org_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '\u673a\u6784\u540d\u79f0',\n  `create_user` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '\u521b\u5efa\u4eba',\n  `create_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '\u521b\u5efa\u65f6\u95f4',\n  `update_user` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '\u66f4\u65b0\u4eba',\n  `update_time` timestamp(6) NOT NULL DEFAULT '0000-00-00 00:00:00.000000' COMMENT '\u66f4\u65b0\u65f6\u95f4',\n  `delete_flag` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '\u5220\u9664\u6807\u8bc6',\n  PRIMARY KEY (`id`) USING BTREE\n) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '\u7528\u6237\u8868\u673a\u6784\u8868' ROW_FORMAT = Compact;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5f15\u5165\u4f9d\u8d56<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;dependency&gt;\n            &lt;groupId&gt;cn.hutool&lt;\/groupId&gt;\n            &lt;artifactId&gt;hutool-all&lt;\/artifactId&gt;\n            &lt;version&gt;5.7.4&lt;\/version&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-data-jpa&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-devtools&lt;\/artifactId&gt;\n            &lt;scope&gt;runtime&lt;\/scope&gt;\n            &lt;optional&gt;true&lt;\/optional&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;mysql&lt;\/groupId&gt;\n            &lt;artifactId&gt;mysql-connector-java&lt;\/artifactId&gt;\n            &lt;scope&gt;runtime&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.projectlombok&lt;\/groupId&gt;\n            &lt;artifactId&gt;lombok&lt;\/artifactId&gt;\n            &lt;optional&gt;true&lt;\/optional&gt;\n        &lt;\/dependency&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n            &lt;scope&gt;test&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n\n        &lt;!-- https:\/\/mvnrepository.com\/artifact\/p6spy\/p6spy --&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;p6spy&lt;\/groupId&gt;\n            &lt;artifactId&gt;p6spy&lt;\/artifactId&gt;\n            &lt;version&gt;3.9.1&lt;\/version&gt;\n        &lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u7f16\u5199\u914d\u7f6e\u6587\u4ef6<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">application.properties<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>spring.datasource.url=jdbc:p6spy:mysql:\/\/localhost:3306\/demo-jpa\nspring.datasource.driver-class-name=com.p6spy.engine.spy.P6SpyDriver\nspring.datasource.username=root\nspring.datasource.password=root<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">spy.properties<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>logMessageFormat=com.p6spy.engine.spy.appender.CustomLineFormat\ncustomLogMessageFormat=sql -&gt; %(sqlSingleLine)\nappender=com.p6spy.engine.spy.appender.StdoutLogger<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u901a\u7528\u5ba1\u8ba1\u65e5\u5fd7\u57fa\u7840\u4fe1\u606f\u914d\u7f6e<\/h2>\n\n\n\n<p>\u7531\u4e8e\u6570\u636e\u521b\u5efa\u4eba\u3001\u521b\u5efa\u65f6\u95f4\u4ee5\u53ca\u6570\u636e\u4fee\u6539\u4eba\u3001\u4fee\u6539\u65f6\u95f4\u4e3a\u516c\u5171\u5b57\u6bb5\uff0c\u5b9e\u73b0AuditorAware\u63a5\u53e3\u914d\u5408@CreateBy\u3001@CreateDate\u3001@LastModifiedBy\u3001@LastModifiedDate\u5373\u53ef\u5b57\u6bb5\u63d2\u5165\u5bf9\u5e94\u7684\u5b57\u6bb5\u4fe1\u606f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Component\n@EnableJpaAuditing\npublic class JpaAuditConfig implements AuditorAware&lt;String&gt; {\n    \/**\n     * \u53ef \u7528\u4e8e \u83b7\u53d6 \u5f53\u524d\u64cd\u4f5c\u4eba\u4fe1\u606f\uff0c\u6839\u636e\u5b9e\u9645\u9879\u76ee\u505a\u8c03\u6574\n     * @return\n     *\/\n    @Override\n    public Optional&lt;String&gt; getCurrentAuditor() {\n        \/\/ \u5f53\u524d\u6d4b\u8bd5\u4e3a\u56fa\u5b9a\u5728\uff0c\u9879\u76ee\u4e2d\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u8c03\u6574\u5373\u53ef\n        String operatorId = \"operateId\";\n        return Optional.of(operatorId);\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u81ea\u5b9a\u4e49\u4e3b\u952e\u751f\u6210\u7b56\u7565<\/h2>\n\n\n\n<p>\u7531\u4e8e\u591a\u8868\u65b0\u589e\u65f6\u6d89\u53ca\u5230\u5173\u8054\u4e3b\u952e\u7684\u95ee\u9898\uff0c\u6545\u8868\u7684\u4e3b\u952e\u9700\u8981\u5148\u751f\u6210\u5907\u7528\uff0c\u65b0\u589e\u6570\u636e\u65f6\u7684\u4e3b\u952e\u751f\u6210\u903b\u8f91\u9700\u8981\u8c03\u6574\uff1a\u82e5\u65b0\u589e\u7684\u5b9e\u4f53\u7c7b\u5df2\u5b58\u5728\u4e3b\u952e\uff0c\u5219\u4e0d\u91cd\u65b0\u751f\u6210\u3002<\/p>\n\n\n\n<p>jpa\u4e3b\u952e\u751f\u6210\u7b56\u7565\u53ef\u53c2\u8003\uff1ahttps:\/\/www.cnblogs.com\/SummerinShire\/p\/7544897.html<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public class CustomUUIDConfig extends UUIDGenerator {\n    \/**\n     *\n     * @param session\n     * @param entityObj \u5f53\u524d\u5b9e\u4f53\u7c7b\u5bf9\u8c61\n     * @return\n     * @throws HibernateException\n     *\/\n    @Override\n    public Serializable generate(SharedSessionContractImplementor session, Object entityObj) throws HibernateException {\n        String entityIdField = this.getEntityIdField(entityObj);\n        if (StrUtil.isBlank(entityIdField)) {\n            throw new RuntimeException(\" Entity must contains id annotation\");\n        }\n        Object existId = ReflectUtil.getFieldValue(entityObj, entityIdField);\n        if (ObjectUtil.isNotNull(existId)) {\n            return (Serializable) existId;\n        }\n        return IdUtil.fastSimpleUUID();\n    }\n\n    \/**\n     * \u83b7\u5f97\u5b9e\u4f53\u7c7b\u4e2did\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\n     * @param entityObj\n     * @return\n     *\/\n    private String getEntityIdField(Object entityObj) {\n        String idFieldName = null;\n        Field&#91;] fields = ReflectUtil.getFields(entityObj.getClass());\n        for (Field field : fields) {\n            if (AnnotationUtil.hasAnnotation(field, Id.class)) {\n                idFieldName = field.getName();\n                break;\n            }\n        }\n        return idFieldName;\n    }\n}<\/code><\/pre>\n\n\n\n<p>jpa \u4e3b\u952e\u751f\u6210\u76844\u4e2d\u7b56\u7565<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u7f16\u5199\u5b9e\u4f53\u7c7b<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u7528\u6237\u5b9e\u4f53\u7c7b<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>@Data\n@Entity\n@ToString\n@Table(name = \"user\")\n@Accessors(chain = true)\n@EntityListeners(AuditingEntityListener.class)\npublic class UserPO implements Serializable {\n\n    private static final long serialVersionUID = -228275281168696921L;\n\n    \/**\n     * \u4e3b\u952eid,\u4f7f\u7528\u81ea\u5b9a\u4e49\u7684\u4e3b\u952e\u751f\u6210\u7b56\u7565\n     *\/\n    @Id\n    @Column\n    @GeneratedValue(generator = \"my-uuid\")\n    @GenericGenerator(name = \"my-uuid\", strategy = \"top.zhoujb.demo.jpa.config.CustomUUIDConfig\")\n    private String id;\n    \/**\n     * \u8d26\u6237\u540d\n     *\/\n    @Column\n    private String account;\n    \/**\n     * \u5bc6\u7801\n     *\/\n    @Column\n    private String password;\n    \/**\n     * \u540d\u79f0\n     *\/\n    @Column\n    private String userName;\n    \/**\n     * \u6027\u522b\n     *\/\n    @Column\n    private Integer gender;\n    \/**\n     * \u5e74\u9f84\n     *\/\n    @Column\n    private Integer age;\n    \/**\n     * \u521b\u5efa\u4eba\n     *\/\n    @Column\n    @CreatedBy\n    private String createUser;\n    \/**\n     * \u521b\u5efa\u65f6\u95f4\n     *\/\n    @Column\n    @CreatedDate\n    private LocalDateTime createTime;\n    \/**\n     * \u66f4\u65b0\u4eba\n     *\/\n    @Column\n    @LastModifiedBy\n    private String updateUser;\n    \/**\n     * \u66f4\u65b0\u65f6\u95f4\n     *\/\n    @Column\n    @LastModifiedDate\n    private LocalDateTime updateTime;\n    \/**\n     * \u5220\u9664\u6807\u8bc6\n     *\/\n    @Column\n    private String deleteFlag;\n\n    \/**\n     * \u673a\u6784\u4ee3\u7801\n     *\/\n    @Transient\n    private String orgCode;\n    \/**\n     * \u673a\u6784\u540d\u79f0\n     *\/\n    @Transient\n    private String orgName;\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u7528\u6237\u673a\u6784\u5b9e\u4f53\u7c7b<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>@Data\n@Entity\n@ToString\n@Accessors(chain = true)\n@Table(name = \"user_org\")\n@EntityListeners(AuditingEntityListener.class)\npublic class UserOrgPO implements Serializable {\n\n    private static final long serialVersionUID = 8618860155842190730L;\n    \/**\n     * \u4e3b\u952eid,\u4f7f\u7528\u81ea\u5b9a\u4e49\u7684\u4e3b\u952e\u751f\u6210\u7b56\u7565\n     *\/\n    @Id\n    @Column\n    @GeneratedValue(generator = \"my-uuid\")\n    @GenericGenerator(name = \"my-uuid\", strategy = \"top.zhoujb.demo.jpa.config.CustomUUIDConfig\")\n    private String id;\n    \/**\n     * \u7528\u6237id\n     *\/\n    private String userId;\n    \/**\n     * \u673a\u6784\u4ee3\u7801\n     *\/\n    private String orgCode;\n    \/**\n     * \u673a\u6784\u540d\u79f0\n     *\/\n    private String orgName;\n    \/**\n     * \u521b\u5efa\u4eba\n     *\/\n    private String createUser;\n    \/**\n     * \u521b\u5efa\u65f6\u95f4\n     *\/\n    private LocalDateTime createTime;\n    \/**\n     * \u66f4\u65b0\u4eba\n     *\/\n    private String updateUser;\n    \/**\n     * \u66f4\u65b0\u65f6\u95f4\n     *\/\n    private LocalDateTime updateTime;\n    \/**\n     * \u5220\u9664\u6807\u8bc6\n     *\/\n    private String deleteFlag;\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u6570\u636e\u5e93\u64cd\u4f5c\u63a5\u53e3<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u7528\u6237\u6570\u636e\u5e93\u8bbf\u95ee\u63a5\u53e3<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>public interface UserDao extends JpaRepository&lt;UserPO, String&gt; {}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u7528\u6237\u673a\u6784\u6570\u636e\u5e93\u8bbf\u95ee\u5c42\u63a5\u53e3<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>public interface UserOrgDao extends JpaRepository&lt;UserOrgPO, String&gt; {}<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">\u6d4b\u8bd5\u6848\u4f8b<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u65b0\u589e<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">\u5355\u8868\u65b0\u589e<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>    @Test\n    void insertOne() {\n        String password = SecureUtil.md5(\"user\");\n        UserPO userPO = new UserPO()\n                .setAccount(\"user\")\n                .setPassword(password)\n                .setUserName(\"\u6d4b\u8bd5\u7528\u6237\")\n                .setAge(20)\n                .setGender(1)\n                .setDeleteFlag(\"0\");\n        this.userDao.save(userPO);\n    }<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">\u591a\u8868\u65b0\u589e<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>    @Test\n    void insertMultipleWithCustomId() {\n        String password = SecureUtil.md5(\"user\");\n        List&lt;UserPO&gt; userList = new ArrayList&lt;&gt;();\n        List&lt;UserOrgPO&gt; userOrgList = new ArrayList&lt;&gt;();\n        for (int i = 1; i &lt;= 10; i++) {\n            String userId = IdUtil.fastSimpleUUID();\n            UserPO userPO = new UserPO()\n                    .setId(userId)\n                    .setAccount(\"user\" + i + RandomUtil.randomInt())\n                    .setPassword(password)\n                    .setUserName(\"\u6d4b\u8bd5\u7528\u6237\" + i + RandomUtil.randomInt())\n                    .setAge(20 + i)\n                    .setGender(i % 2)\n                    .setDeleteFlag(\"0\");\n            userList.add(userPO);\n            UserOrgPO userOrgPO = new UserOrgPO()\n                    .setUserId(userId)\n                    .setDeleteFlag(\"0\")\n                    .setOrgCode(\"orgCode\" + i + RandomUtil.randomInt())\n                    .setOrgName(\"orgName\" + i + RandomUtil.randomInt());\n            userOrgList.add(userOrgPO);\n        }\n        this.userDao.saveAllAndFlush(userList);\n        this.userOrgDao.saveAllAndFlush(userOrgList);\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u4fee\u6539<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>    @Test\n    public void update() {\n        String userId = \"5d744def266146fc9b99d7f7b87883e4\";\n        Optional&lt;UserPO&gt; opt = this.userDao.findById(userId);\n        UserPO userPO = new UserPO();\n        if (opt.isPresent()) {\n            BeanUtil.copyProperties(opt.get(), userPO);\n        }\n        userPO.setUserName(\"777\").setAccount(\"user666\");\n        UserPO save = this.userDao.save(userPO);\n        System.out.println(save.toString());\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5220\u9664<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>    @Test\n    public void deleteOne() {\n        String userId = \"2e78a777172b46e392cc2416ad0043b4\";\n        this.userDao.deleteById(userId);\n    }\n\n    @Test\n    public void deleteMany() {\n        List&lt;String&gt; idList = ListUtil.toList(\"f4394921d44243228fe15115fa4ea693\", \"ce99a184246a4af5ae5f3bbabf0dd807\");\n        this.userDao.deleteAllByIdInBatch(idList);\n    }<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u67e5\u8be2<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u7b80\u5355\u67e5\u8be2<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>    @Test\n    public void findOne() {\n        String userId = \"a1f704b9600548e6a71e6d694e04698a\";\n        Optional&lt;UserPO&gt; byId = this.userDao.findById(userId);\n        if (byId.isPresent()) {\n            System.out.println(byId.get().toString());\n        } else {\n            System.out.println(\"no data\");\n        }\n    }\n\n    @Test\n    public void findAll() {\n        List&lt;UserPO&gt; all = this.userDao.findAll();\n        System.out.println(all.size());\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u666e\u901a\u5355\u8868\u5206\u9875<\/h3>\n\n\n\n<p>\u81ea\u5b9a\u4e49\u5206\u9875\u65b9\u6cd5\uff0c\u53c2\u6570\u4e3a\u5b9e\u4f53\u7c7b\u65f6\uff0c\u5728UserDao\u63a5\u53e3\u4e2d\u6dfb\u52a0\u5982\u4e0b\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    \/**\n     * \u5206\u9875\u67e5\u8be2\u6570\u636e\n     * @param params\n     * @param pageRequest\n     * @return\n     *\/\n    @Query(nativeQuery=true, value = \"select * from user where account like %:#{#user.account}%\")\n    Page&lt;UserPO&gt; selectByPage(@Param(\"user\") UserPO params, Pageable pageRequest);<\/code><\/pre>\n\n\n\n<p>\u6d4b\u8bd5\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    @Test\n    public void findByPage() {\n        int page = 1;\n        int size = 5;\n        Sort genderSort = Sort.by(Sort.Direction.ASC, \"gender\");\n        Pageable pageRequest = PageRequest.of(page, size, genderSort);\n        UserPO params = new UserPO().setAccount(\"user\");\n        Page&lt;UserPO&gt; poPage = this.userDao.selectByPage(params, pageRequest);\n        System.out.println(poPage.getContent().size());\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u591a\u8868\u8054\u5408\u5206\u9875<\/h3>\n\n\n\n<p>\u591a\u8868\u5206\u9875\uff0c\u53c2\u6570\u4e3a\u5b9e\u4f53\u7c7b\u65f6\uff0c\u5728UserDao\u63a5\u53e3\u4e2d\u6dfb\u52a0\u5982\u4e0b\u4ee3\u7801\u3002\u6ce8\u610f\uff1a<strong>\u6b64\u65f6\u9700\u8981\u81ea\u5df1\u91cd\u5199countQuery\uff0c\u5426\u5219\u4f1a\u5bfc\u81f4sql\u6267\u884c\u62a5\u9519\u6216\u8005\u7edf\u8ba1\u7ed3\u679c\u9519\u8bef\u7b49\u95ee\u9898\u3002<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    \/**\n     * \u5206\u9875\u67e5\u8be2\u6570\u636e\n     * @param params\n     * @param pageRequest\n     * @return\n     *\/\n    @Query(nativeQuery = true,\n            value = \"select u.*,uo.org_code,uo.org_name from user u join user_org uo on uo.user_id = u.id where u.account like %:#{#user.account}%\"\n            , countQuery = \"select count(*) from user u join user_org uo on uo.user_id = u.id where u.account like %:#{#user.account}%\"\n    )\n    Page&lt;UserPO&gt; selectUseAndOrgByPage(@Param(\"user\") UserPO params, Pageable pageRequest);<\/code><\/pre>\n\n\n\n<p>\u6d4b\u8bd5\u4ee3\u7801<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    @Test\n    public void findByPageWithMultipleTable() {\n        int page = 1;\n        int size = 5;\n        Sort genderSort = Sort.by(Sort.Direction.ASC, \"gender\");\n        Pageable pageRequest = PageRequest.of(page, size, genderSort);\n        UserPO params = new UserPO().setAccount(\"user\");\n        Page&lt;UserPO&gt; poPage = this.userDao.selectUseAndOrgByPage(params, pageRequest);\n        List&lt;UserPO&gt; content = poPage.getContent();\n        if (CollUtil.isNotEmpty(content)) {\n            content.stream().forEach(uo -&gt; System.out.println(uo.toString()));\n        }\n    }<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">\u603b\u7ed3<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u6ce8\u610f\u4e8b\u9879<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>\u8bf4\u660e<\/th><\/tr><\/thead><tbody><tr><td>\u67e5\u8be2\u53c2\u6570\u4e3a\u5b9e\u4f53\u7c7b\u65f6\u53c2\u6570\u4e66\u5199\u65b9\u5f0f<\/td><td>\u683c\u5f0f: :#{#\u5b9e\u4f53\u7c7b\u53c2\u6570\u540d.\u5b9e\u4f53\u7c7b\u5c5e\u6027\u540d}\u3002\u793a\u4f8b\uff1a\u5b9e\u4f53\u7c7b\u53c2\u6570\u540d\u79f0\u4e3a\uff1aparams,\u5176\u4e2d\u6709name\u5c5e\u6027\uff0c\u5219\u5728sql\u4e2d\u5e94\u4e3a\uff1a:#{#params.name}<\/td><\/tr><tr><td>\u591a\u8868\u8054\u5408\u67e5\u8be2\u6ce8\u610f\u4e8b\u9879<\/td><td>\u591a\u8868\u8054\u5408\u5206\u9875\u67e5\u8be2\u65f6\u9700\u8981\u7edf\u8ba1sql<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">jpa \u7684\u5173\u952e\u5b57\u4f7f\u7528<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u5173\u952e\u5b57<\/th><th>\u6848\u4f8b<\/th><th>\u6267\u884c\u7684SQL\u7247\u6bb5<\/th><\/tr><\/thead><tbody><tr><td>Distinct<\/td><td>findDistinctByLastnameAndFirstname<\/td><td>select distinct \u2026 where x.lastname = ?1 and x.firstname = ?2<\/td><\/tr><tr><td>And<\/td><td>findByLastnameAndFirstname<\/td><td>\u2026 where x.lastname = ?1 and x.firstname = ?2<\/td><\/tr><tr><td>Or<\/td><td>findByLastnameOrFirstname<\/td><td>\u2026 where x.lastname = ?1 or x.firstname = ?2<\/td><\/tr><tr><td>Is, Equals<\/td><td>findByFirstname,findByFirstnameIs,findByFirstnameEquals<\/td><td>\u2026 where x.firstname = ?1<\/td><\/tr><tr><td>Between<\/td><td>findByStartDateBetween<\/td><td>\u2026 where x.startDate between ?1 and ?2<\/td><\/tr><tr><td>LessThan<\/td><td>findByAgeLessThan<\/td><td>\u2026 where x.age &lt; ?1<\/td><\/tr><tr><td>LessThanEqual<\/td><td>findByAgeLessThanEqual<\/td><td>\u2026 where x.age &lt;= ?1<\/td><\/tr><tr><td>GreaterThan<\/td><td>findByAgeGreaterThan<\/td><td>\u2026 where x.age &gt; ?1<\/td><\/tr><tr><td>GreaterThanEqual<\/td><td>findByAgeGreaterThanEqual<\/td><td>\u2026 where x.age &gt;= ?1<\/td><\/tr><tr><td>After<\/td><td>findByStartDateAfter<\/td><td>\u2026 where x.startDate &gt; ?1<\/td><\/tr><tr><td>Before<\/td><td>findByStartDateBefore<\/td><td>\u2026 where x.startDate &lt; ?1<\/td><\/tr><tr><td>IsNull, Null<\/td><td>findByAge(Is)Null<\/td><td>\u2026 where x.age is null<\/td><\/tr><tr><td>IsNotNull, NotNull<\/td><td>findByAge(Is)NotNull<\/td><td>\u2026 where x.age not null<\/td><\/tr><tr><td>Like<\/td><td>findByFirstnameLike<\/td><td>\u2026 where x.firstname like ?1<\/td><\/tr><tr><td>NotLike<\/td><td>findByFirstnameNotLike<\/td><td>\u2026 where x.firstname not like ?1<\/td><\/tr><tr><td>StartingWith<\/td><td>findByFirstnameStartingWith<\/td><td>\u2026 where x.firstname like ?1 (parameter bound with appended %)<\/td><\/tr><tr><td>EndingWith<\/td><td>findByFirstnameEndingWith<\/td><td>\u2026 where x.firstname like ?1 (parameter bound with prepended %)<\/td><\/tr><tr><td>Containing<\/td><td>findByFirstnameContaining<\/td><td>\u2026 where x.firstname like ?1 (parameter bound wrapped in %)<\/td><\/tr><tr><td>OrderBy<\/td><td>findByAgeOrderByLastnameDesc<\/td><td>\u2026 where x.age = ?1 order by x.lastname desc<\/td><\/tr><tr><td>Not<\/td><td>findByLastnameNot<\/td><td>\u2026 where x.lastname &lt;&gt; ?1<\/td><\/tr><tr><td>In<\/td><td>findByAgeIn(Collection ages)<\/td><td>\u2026 where x.age in ?1<\/td><\/tr><tr><td>NotIn<\/td><td>findByAgeNotIn(Collection ages)<\/td><td>\u2026 where x.age not in ?1<\/td><\/tr><tr><td>TRUE<\/td><td>findByActiveTrue()<\/td><td>\u2026 where x.active = true<\/td><\/tr><tr><td>FALSE<\/td><td>findByActiveFalse()<\/td><td>\u2026 where x.active = false<\/td><\/tr><tr><td>IgnoreCase<\/td><td>findByFirstnameIgnoreCase<\/td><td>\u2026 where UPPER(x.firstname) = UPPER(?1)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u6765\u6e90\uff1ahttps:\/\/docs.spring.io\/spring-data\/jpa\/docs\/current\/reference\/html\/#jpa.query-methods.query-creation<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u7b80\u4ecb \u7248\u672c\u4ecb\u7ecd \u7248\u672c \u5907\u6ce8 SpringBoot 2.6.4 MySQL 5.6.51 p6spy 3.9.1 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[21,22],"class_list":["post-108","post","type-post","status-publish","format-standard","hentry","category-java","tag-jpa","tag-mysql"],"_links":{"self":[{"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/posts\/108"}],"collection":[{"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=108"}],"version-history":[{"count":1,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/posts\/108\/revisions"}],"predecessor-version":[{"id":109,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/posts\/108\/revisions\/109"}],"wp:attachment":[{"href":"https:\/\/zhoujibin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=108"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=108"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}