當前位置:首頁 » 文件管理 » jpa緩存配置

jpa緩存配置

發布時間: 2022-09-07 21:46:07

❶ JPA實用手冊,即看即用

修改查詢

@Modifying

@Query("update User u set u.firstname = ?1 where u.lastname = ?2")

int setFixedFirstnameFor(String firstname, String lastname);

使用 Sort 和 JpaSort

public interface UserRepository extends JpaRepository {

  @Query("select u from User u where u.lastname like ?1%")

  List findByAndSort(String lastname, Sort sort);

  @Query("select u.id, LENGTH(u.firstname) as fn_len from User u where u.lastname like ?1%")

  List findByAsArrayAndSort(String lastname, Sort sort);

}

repo.findByAndSort("lannister", new Sort("firstname"));           

repo.findByAndSort("stark", new Sort("LENGTH(firstname)"));       

repo.findByAndSort("targaryen", JpaSort.unsafe("LENGTH(firstname)"));

repo.findByAsArrayAndSort("bolton", new Sort("fn_len"));   

使用已命名參數

public interface UserRepository extends JpaRepository {

  @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")

  User findByLastnameOrFirstname(@Param("lastname") String lastname,

                                @Param("firstname") String firstname);

}   

原生SQL分頁

public interface UserRepository extends JpaRepository {

  @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",

    countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",

    nativeQuery = true)

  Page findByLastname(String lastname, Pageable pageable);

}

Sort sort =newSort(Sort.Direction.DESC,"createTime");//創建時間降序排序Pageable pageable =newPageRequest(pageNumber,pageSize,sort);

使用原生SQL

public interface UserRepository extends JpaRepository {

  @Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)

  User findByEmailAddress(String emailAddress);

}

為了消除不確定性,可以在方法名內使用下劃線「_」手動定義隔斷點。

List findByAddress_ZipCode(ZipCode zipCode);

查詢方法建立

distinct flag

ignoring case

order by

public interface PersonRepository extends Repository {

  List findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

  // Enables the distinct flag for the query  List (String lastname, String firstname);

  List (String lastname, String firstname);

  // Enabling ignoring case for an indivial property  List findByLastnameIgnoreCase(String lastname);

  // Enabling ignoring case for all suitable properties  List (String lastname, String firstname);

  // Enabling static ORDER BY for a query  List (String lastname);

  List (String lastname);

}

非同步查詢結果

@Async

Future findByFirstname(String firstname);           

@Async

CompletableFuture findOneByFirstname(String firstname);

@Async

ListenableFuture findOneByLastname(String lastname);

Like模糊查詢

@Query(value = "select name,author,price from Book b where b.name like %:name%")

List findByNameMatch(@Param("name") String name);

In 查詢

@Query(value = "select * from trade$seek_purchase_offer where sp_id in (:spIds) and of_enuu = :enUu", nativeQuery = true)

    List getSeekPurchaseOfferList(@Param("spIds") List spIds, @Param("enUu") Long enUu);

MappedSuperClass:

映射為非實體父類,該實體父類不會生成對應的數據表

@OneToOne

@Entity

@Table(name = "costume_all_id")

public class AllId extends AbstractEntity {

    private static final long serialVersionUID = 1L;

    @OneToOne(cascade = CascadeType.ALL)

    @JoinColumn(name = "costume_member_fk")

    private Member member;// 用戶表外鍵

}

@OneToMany和@ManyToOne

@Entity

@Table(name = "costume_organization")

public class Organization extends AbstractEntity {

    private static final long serialVersionUID = 1L;

    @Column(nullable = false, length = 50)

    private String name; // 組織名稱

    @OneToMany(mappedBy = "organization")

    private Set departmentSet; // 部門集合

}

@Entity

@Table(name = "costume_department")

public class Department extends AbstractEntity {

    private static final long serialVersionUID = 1L;

    @Column(nullable = false, length = 50)

    private String name; // 部門名稱

    @ManyToOne(optional = false)

    private Organization organization; // 組織外鍵

    @ManyToMany

    private Set memberSet; // 用戶表外鍵

    public Organization getOrganization() {

        return organization;

    }

    @JsonBackReference

    public void setOrganization(Organization organization) {

        this.organization = organization;

    }

}

@ManyToMany

Entity

@Table(name = "costume_member")

public class Member extends AbstractEntity {

    private static final long serialVersionUID = 1L;

    @Column(nullable = false, length = 20)

    private String name;

    @ManyToMany

    @JoinTable(joinColumns = { @JoinColumn(name = "member_id") }, inverseJoinColumns = {

            @JoinColumn(name = "department_id") }) //被控方表欄位名

    private Set departmentSet; // 部門表外鍵

    public Set getDepartmentSet() {

        return departmentSet;

    }

    @JsonBackReference

    public void setDepartmentSet(Set departmentSet)

    {

        this.departmentSet = departmentSet;

    }

}

HQL通過旅店名稱查詢旅店以及城市的所有信息 直接返回實體類

/**

* 關聯查詢

*

* @return

*/

@Query(value = "select new pers.zpw.domain.CityHohel(t1.name AS cityName,t2.name AS hotelName) from  TCity t1 left  join THotel t2 on t1.id=t2.city where t2.name =:name")

List (@Param("name") String name);

@Data

public class CityHohel {

        private String cityName;

        private String hotelName;

        public CityHohel(String cityName, String hotelName) {

            this.cityName = cityName;

            this.hotelName = hotelName;

        }

}

實例2

@Entity 

@Table(name="orders") 

public class Order { 

    private String orderid; 

    private Float amount = 0f; 

    private Set items = new HashSet(); 

    @Id 

    @Column(length = 12) 

    public String getOrderid() { 

        return orderid; 

    } 

    public void setOrderid(String orderid) { 

        this.orderid = orderid; 

    } 

    @Column(nullable = false) 

    public Float getAmount() { 

        return amount; 

    } 

    public void setAmount(Float amount) { 

        this.amount = amount; 

    } 

@OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REMOVE },mappedBy ="order") //這里配置關系,並且確定關系維護端和被維護端。mappBy表示關系被維護端,只有關系端有權去更新外鍵。這里還有注意OneToMany默認的載入方式是賴載入。當看到設置關系中最後一個單詞是Many,那麼該載入默認為懶載入 

    public Set getItems() { 

        return items; 

    } 

    public void setItems(Set items) { 

        this.items = items; 

    } 

        /** 

          *該方法用於向order中加order項 

          /* 

    public void addOrderItem(OrderItem orderItem){ 

        orderItem.setOrder(this);//用關系維護端來維護關系 

        this.items.add(orderItem); 

    } 

}

@Entity 

public class OrderItem { 

    private Integer id; 

    private String proctName; 

    private Float sellPrice = 0f; 

    private Order order; 

    @Id 

    @GeneratedValue 

    public Integer getId() { 

        return id; 

    } 

    public void setId(Integer id) { 

        this.id = id; 

    } 

    @Column(length = 40, nullable = false) 

    public String getProctName() { 

        return proctName; 

    } 

    public void setProctName(String proctName) { 

        this.proctName = proctName; 

    } 

    @Column(nullable = false) 

    public Float getSellPrice() { 

        return sellPrice; 

    } 

    public void setSellPrice(Float sellPrice) { 

        this.sellPrice = sellPrice; 

    } 

    @ManyToOne(cascade = {CascadeType.MERGE,CascadeType.REFRESH }, optional = true) 

    @JoinColumn(name="order_id")//這里設置JoinColum設置了外鍵的名字,並且orderItem是關系維護端 

    public Order getOrder() { 

        return order; 

    } 

    public void setOrder(Order order) { 

        this.order = order; 

    } 



緩存

  

    org.springframework.boot  

    spring-boot-starter-cache  

@Configuration  

@EnableCaching  

public class CacheConfig {  

}  

@Cacheable

Spring 在執行 @Cacheable 標注的方法前先查看緩存中是否有數據,如果有數據,則直接返回緩存數據;若沒有數據,執行該方法並將方法返回值放進緩存。

參數: value緩存名、 key緩存鍵值、 condition滿足緩存條件、unless否決緩存條件

@Cacheable(value = "user", key = "#id")  

public User findById(final Long id) {  

    System.out.println("cache miss, invoke find by id, id:" + id);  

    for (User user : users) {  

        if (user.getId().equals(id)) {  

            return user;  

        }  

    }  

    return null;  

}  

@CachePut

和 @Cacheable 類似,但會把方法的返回值放入緩存中, 主要用於數據新增和修改方法。

@CachePut(value = "user", key = "#user.id")  

public User save(User user) {  

    users.add(user);  

    return user;  



@CacheEvict

方法執行成功後會從緩存中移除相應數據。

參數: value緩存名、 key緩存鍵值、 condition滿足緩存條件、 unless否決緩存條件、 allEntries是否移除所有數據(設置為true時會移除所有緩存)

@CacheEvict(value = "user", key = "#user.id") // 移除指定key的數據  

public User delete(User user) {  

    users.remove(user);  

    return user;  

}  

@CacheEvict(value = "user", allEntries = true) // 移除所有數據  

public void deleteAll() {  

    users.clear();  

}  

spring.cache.type=none ***設置緩存無效化

集成EhCache

  

    net.sf.ehcache  

    ehcache  

         xsi:noNamespaceSchemaLocation="ehcache.xsd">  

      

src\main\resources/application.properties

spring.cache.ehcache.config=classpath:ehcache.xml

如果想自定義設置一些個性化參數時,通過Java Config形式配置。

@Configuration  

@EnableCaching  

public class CacheConfig {  

    @Bean  

    public CacheManager cacheManager() {  

        return new EhCacheCacheManager(ehCacheCacheManager().getObject());  

    }  

    @Bean  

    public EhCacheManagerFactoryBean ehCacheCacheManager() {  

        EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();  

        cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));  

        cmfb.setShared(true);  

        return cmfb;  

    }  

}  

組合CacheManager

從多個CacheManager中輪詢得到相應的Cache。

@Configuration  

@EnableCaching  

public class CacheConfig {  

    @Bean  

    public CacheManager compositeCacheManager(RedisTemplate redisTemplate) {  

        CompositeCacheManager cacheManager = new CompositeCacheManager(new ConcurrentMapCacheManager(), new SimpleCacheManager());  

        cacheManager.setFallbackToNoOpCache(false);  

        cacheManager.afterPropertiesSet();  

        return cacheManager;  

    }  

❷ 請問jpa有一級緩存嗎如果用jpa向資料庫連續插入百萬千萬條數據,該如何解決效率問題

不清楚jpa是什麼。你說的連續插入是怎麼回事?很多業務運行的數據,還是就是導入數據?倒入數據可以用其他手段

❸ Spring Data Jpa如何新增和更新

根據ID做新增或者update,主鍵上打@Id。

❹ springboot緩存怎麼來操作

1.在pom.xml中引入cache依賴,添加如下內容:

復制代碼
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
復制代碼
2.在Spring Boot主類中增加@EnableCaching註解開啟緩存功能,如下:

復制代碼
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
復制代碼
3.在數據訪問介面中,增加緩存配置註解,如:

復制代碼
@CacheConfig(cacheNames = "users")
public interface UserRepository extends JpaRepository<User, Long> {
@Cacheable
User findByName(String name);
}
復制代碼

SpringBoot支持很多種緩存方式:redis、guava、ehcahe、jcache等等。

❺ 菜鳥求解,怎麼關閉JPA緩存,查詢不到更新後的數據

penJPA如何在更新資料庫時,同時更新緩存的數據/(不丟棄緩存再重新讀取數據來緩存)
OpenJPA如何在更新資料庫時,同時更新緩存的數據/(不丟棄緩存再重新讀取數據來緩存)。。。。
在線等解決方案。
速求各

熱點內容
雲存儲免費的攝像頭 發布:2024-10-12 00:15:47 瀏覽:620
DA與腳本 發布:2024-10-12 00:14:22 瀏覽:255
如何看配置支不支持黑蘋果 發布:2024-10-12 00:13:45 瀏覽:588
固件怎麼編譯 發布:2024-10-12 00:05:48 瀏覽:90
隨機編譯軌道教學 發布:2024-10-11 23:52:56 瀏覽:412
為什麼人力資源更改密碼還是登錄不了 發布:2024-10-11 23:52:56 瀏覽:468
直線畫中點演算法 發布:2024-10-11 23:52:55 瀏覽:931
帕拉迪堡壘機密碼如何更改 發布:2024-10-11 23:39:58 瀏覽:208
sqlserver期末試題 發布:2024-10-11 23:39:45 瀏覽:599
小度智能音箱如何解除配置 發布:2024-10-11 23:39:06 瀏覽:515