亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用@Query 從 SPRING BOOT 中的文件獲取查詢

使用@Query 從 SPRING BOOT 中的文件獲取查詢

幕布斯6054654 2021-10-28 10:45:01
為了模擬java.lang.OutOfMemoryError: Metaspace,您必須加載許多不同的類。首先必須設置以下元空間設置:-XX:MaxMetaspaceSize=10m-XX:MetaspaceSize=2M-XX:MaxMetaspaceFreeRatio=1-XX:MaxMetaspaceExpansion=1K-XX:MinMetaspaceFreeRatio=1-XX:InitialBootClassLoaderMetaspaceSize=2M然后下面的代碼讓類加載器加載了很多不同的類。這是通過獲取類的編譯字節碼mypackage.Myclass0并通過更改類名和調整類名的長度來調整以迭代地創建新類來實現的:    public static void main(String[] args) throws Exception {        String clazzBase64 ="yv66vgAAADcADAEAEm15cGFja2FnZS9NeWNsYXNzMAcAAQEAEGphdmEvbGFuZy9PYmplY3QHAAMBAApTb3VyY2VGaWxlAQANTXljbGFzczAuamF2YQEABjxpbml0PgEAAygpVgwABwAICgAEAAkBAARDb2RlACEAAgAEAAAAAAABAAEABwAIAAEACwAAABEAAQABAAAABSq3AAqxAAAAAAABAAUAAAACAAY=";        byte[] compiledClazz = Base64.getDecoder().decode(clazzBase64);        int classNameLength = Integer.valueOf(compiledClazz[12]);        MyClassLoader myClassLoader = new MyClassLoader(Thread.currentThread().getContextClassLoader());        for (int i = 0; ; i++) {            byte[] bytes = String.valueOf(i).getBytes();            byte[] bytecode = new byte[compiledClazz.length + bytes.length - 1];            System.arraycopy(compiledClazz, 0, bytecode, 0, 30);            bytecode[12] = (byte) (classNameLength + bytes.length - 1 & 0xFF);            System.arraycopy(bytes, 0, bytecode, 30, bytes.length);            System.arraycopy(compiledClazz, 31, bytecode, 30 + bytes.length, compiledClazz.length - 31);            String classname = "mypackage.Myclass" + i;            Class c = myClassLoader.getClass(classname, bytecode);        }    }    public static class MyClassLoader extends ClassLoader {        public MyClassLoader(ClassLoader parent) {            super(parent);        }        public Class<?> getClass(String name, byte[] code) {            return defineClass(name, code, 0, code.length);        }    }
查看完整描述

3 回答

?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

如果您需要從資源文件夾中加載 SQL,您可以嘗試使用spring-data-sqlfile庫。它支持從資源加載 SQL 查詢。所以你只需要將你的 SQL 查詢放到資源文件夾中,然后你就可以在 SqlFromResource 注釋中引用它們:


@Repository

public interface UserRepository extends JpaRepository<User, Integer> {

    @SqlFromResource(path = "select_user_by_id.sql")

    User findById(int userId);

}

輸出將類似于:


@Repository

public interface UserRepositoryGenerated extends JpaRepository<User, Integer> {    

  @Query(

      value = "SELECT *     FROM users     WHERE id = :userId",

      nativeQuery = true

  )

  User findById(int userId);

}


查看完整回答
反對 回復 2021-10-28
?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

不幸的是,spring 數據似乎不支持@Query anno 的直接屬性引用(如@Value)。盡管如此,假設您使用 spring-data-jpa 和 Hibernate,則可以使用外部 .xml 文件將您的查詢存儲為命名查詢,并通過方法名稱或類似方式引用它們

@Query(nativeQuery = true, name="Repository1.query1")

這是一篇關于這個問題的好文章:XML 文件中的 JPA 查詢,它描述了如何將 .xml 文件放在預期的 orm.xml 之外的其他地方


查看完整回答
反對 回復 2021-10-28
  • 3 回答
  • 0 關注
  • 240 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號