第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定

JPA 使用@Where 注解實現(xiàn)全局過濾

需求

在互联网项目中,通常删除都不是物理删除,而是逻辑删除。那么在展示数据的时候需要过滤掉已删除的数据。而@Where 注解可以说就是为此而设计的。

/**
 * Where clause to add to the element Entity or target entity of a collection.  The clause is written in SQL.
 * A common use case here is for soft-deletes.
 *
 * @author Emmanuel Bernard
 */@Target({TYPE, METHOD, FIELD})@Retention(RUNTIME)public @interface Where {    /**
     * The where-clause predicate.
     */
    String clause();
}

大致意思为通常添加在集合或实体类上作为sql 的where条件使用,常见的使用方式是软删除。因为是where 子句的条件,所以写的是数据库字段的名称与实际结果。

使用

实体类

@Entity@Table(name = "tb_abc")@Data@Where(clause = "del_flag=0")public class ABC {    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)    private int id;    private String name;    private boolean delFlag;
}

单元测试

    @Test
    public void whereTest(){
        Optional<ABC> one = abcRepository.findById(1);
        System.out.println(one.isPresent());
        ABC a3 = abcRepository.findByName("a3");
        System.out.println(a3);
        ABC byDelFlagIsTrue = abcRepository.findByDelFlagIsTrue();
        System.out.println(byDelFlagIsTrue);
        List<ABC> all = abcRepository.findAll();
        System.out.println(all.toString());
    }
select abc0_.id as id1_0_0_, abc0_.del_flag as del_flag2_0_0_, abc0_.name as name3_0_0_ from abc abc0_ where abc0_.id=? and ( abc0_.del_flag=0)select abc0_.id as id1_0_, abc0_.del_flag as del_flag2_0_, abc0_.name as name3_0_ from abc abc0_ where ( abc0_.del_flag=0) and abc0_.name=?select abc0_.id as id1_0_, abc0_.del_flag as del_flag2_0_, abc0_.name as name3_0_ from abc abc0_ where ( abc0_.del_flag=0) and abc0_.del_flag=1select abc0_.id as id1_0_, abc0_.del_flag as del_flag2_0_, abc0_.name as name3_0_ from abc abc0_ where ( abc0_.del_flag=0)

那万一想查已被删除的数据

先试一下@Query 的方式

    @Query("select a from ABC a where  a.name=?1")    ABC findByName1(String name);

结果

select abc0_.id as id1_0_, abc0_.del_flag as del_flag2_0_, abc0_.name as name3_0_ from tb_abc abc0_ where ( abc0_.del_flag=0) and abc0_.name=?null

再试下原生的方式

    @Query(nativeQuery = true, value = "select * from tb_abc where name = ?1")    ABC findByName2(String name);
select * from tb_abc where name = ?
ABC(id=2, name=a1, delFlag=true)

总结

相比于要查已删除的数据,情况远比查未删除的少得多。所以在实体类上加上@Where注解来筛选那些通常不变的条件是省时省力的做法。



作者:StephenRo
链接:https://www.jianshu.com/p/c38672fc142e


點擊查看更多內(nèi)容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優(yōu)質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優(yōu)惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號

舉報

0/150
提交
取消