@Select 业务查询对象

public @interface Select {
// 手动 SQL 部分
    String value();

// 通过实体获取 select SQL
    Class<?> entityClass() default Void.class;

// 参数
    String params() default "";

// 指定参数如果为null,返回结果直接是 null。一般设置所有 param,参数都不为 null 请求查询,否则直接返回 null;如果都不设置,参数会当作 null 处理
    String[] nullWhenParamsIsNull() default {};

// 是否级联查询
    boolean cascadeSelect() default true;
}

手动写select SQL,并映射到对象上(POJO)

@Select(value = "SELECT id, code, description FROM mm_material WHERE id = :id",
       params = "id@stockLocation.materialId", nullWhenParamsIsNull = "id", cascadeSelect = false)
MaterialVO material;

实体对象select SQL,拼接 value Condition 并映射到对象上(POJO)

@Select(entityClass = Material.class, // select
        value = "WHERE id = :id", // condition
        params = "id@stockLocation.materialId", nullWhenParamsIsNull = "id", cascadeSelect = false)
Material material;


@Select(entityClass = Classification.class,
          value = "WHERE EXISTS (select 1 from mm_material_classification WHERE classification_id = mm_classification.id AND material_id = :id)",
          params = "id@stockLocation.materialId", nullWhenParamsIsNull = "id") 
private List<Classification> classificationList;

查询对象

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@SuperBuilder
@Table
public class UserSelect extends EntityId<Long> {

    /**
     * 一对一主键关联
     * 在 service 中处理
     */
    @OneToMany(oneToOne = true, joinColumnId = "id", mappedBy = "id")
    @NotNull
    IdCard idCard;

    /**
     * 一对多外键关联
     */
    @OneToMany(mappedBy = "user", joinColumnId = "user_id")
    List<Pet> petList;

    @ManyToMany(tableName = "t_user_role", joinColumnId = "user_id", inverseJoinColumnId = "role_id"/*, cascadeSave = true, mappedBy = "userList"*/)
    List<Role> roleList;

    // @Select 查询
    private Long userId;

    @Select(
            entityClass = User.class,
            value = "WHERE id = :userId",
            params = "userId@userId", nullWhenParamsIsNull = "userId"
    )
    private User user;

    @Select(
            entityClass = User.class,
            value = "WHERE id = :userId",
            params = "userId@userId", nullWhenParamsIsNull = "userId"
    )
    private Map<String, Object> map;

    @Select(
            value = "SELECT * FROM sys_user"
    )
    private List<Map<String, Object>> userList;

    @Select(
            entityClass = User.class,
            value = "WHERE id = :userId",
            params = "userId@userId", nullWhenParamsIsNull = "userId"
    )
    private List<User> userList2;

}

测试1

    @Test
    public void testSelect1() {
        List<User> userList = entityDAO.select(Map.of("id", userId));
        User user = userList.get(0);

        User user2 = new User();
        user2.setId(userId);
        entityDAO.cascadeSelect(List.of(user2));

        List<User> list = entityDAO.select(user2);
        assertEquals(true, EqualsBuilder.reflectionEquals(list.get(0), user));

        UserSelect select = new UserSelect();

        BeanUtils.copyProperties(SerializationUtils.clone(user), select);

        select.getIdCard().setCode(null);
        for (Role role : select.getRoleList()) {
            role.setUserList(null);
            role.setName(null);
        }

        for (Pet pet : select.getPetList()) {
            pet.setUser(null);
            pet.setName(null);
        }

        entityDAOSupport.select(select);

        user2.setRoleList(select.getRoleList());
        user2.setNameList(user.getNameList());
        user2.setIdCard(select.getIdCard());
        user2.setPetList(select.getPetList());
        user2.setName(user.getName());
        user2.setBaseEntityInfo(user.getBaseEntityInfo());

        assertEquals(true, EqualsBuilder.reflectionEquals(user2, user));

        List<UserSelect> userSelectList1 = entityDAOSupport.select(UserSelect.class, "select id from t_user where id = :id", Map.of("id", userId));
        List<UserSelect> userSelectList2 = entityDAOSupport.select(UserSelect.class, "select id from t_user where id = ?", userId);
        assertEquals(true, EqualsBuilder.reflectionEquals(userSelectList1.get(0), userSelectList2.get(0)));
    }

测试2

    @Test
    public void testSelect2() {
        UserSelect userSelect = new userSelect();
        userSelect.setUserId(1L);
        UserSelect select = entityDAOSupport.select(userSelect);
        System.out.println(select);
    }