Spring Boot 是否可以使用没有实体的JpaRepository?

zujrkrfu  于 2022-12-23  发布在  Spring
关注(0)|答案(4)|浏览(321)

JpaRepository可以不带实体使用吗?在这种情况下,用DTO代替。
如下所示

@Repository
public interface BffRepository extends JpaRepository<BffDTO, String> {

@Query(nativeQuery = true, value = "select\n"
        + "ent.name as enterprise_name, dep.name as department_name,\n"
        + "sq.name as squad_name, acc.firstname as job_owner_name,\n"
        + "tpt.name as test_template_name, job.name, job.job_blocked, job.job_removed,\n"
        + "job.bot_scm_branch, job.bot_scm_url, job.schedule_startdate,\n"
        + "job.expiration_date, job.timestamp,job.uuid,job.schedule_starttime,\n"
        + "tpt.job_execution_timeout\n"
        + "from portal.jobs job\n"
        + "left join portal.enterprises ent on (ent.uuid = job.enterprise_id)\n"
        + "left join portal.departments dep on (dep.uuid = job.department_id)\n"
        + "left join portal.squads sq on (sq.uuid = job.squad_id)\n"
        + "left join portal.accounts acc on (acc.uuid = job.job_owner)\n"
        + "left join portal.test_plan_templates tpt on (tpt.uuid = job.template_id) where\n"
        + "job.job_owner = ?1 and job.job_removed = false order by timestamp desc;")
List<BffDTO>buscarPorJobOwner(String jobOwner);

这种情况下有其他选择吗?
注意:DTO已Map,但我不想创建视图来将此DTO转换为实体。
我已经验证了该主题,但没有重大改进Use JpaRepository interaction style without entity
我正在尝试这个
接口-
公共接口BffDTO接口2 {

String uuid();

String enterprise_name();

String department_name();

String squad_name();

String job_owner_name();

String test_template_name();

String name();

Boolean job_blocked();

Boolean job_removed();

String bot_scm_branch();

String bot_scm_url();

String schedule_startdate();

String expiration_date();

String timestamp();

String schedule_starttime();

Integer job_execution_timeout();

@Transient
String status();

}
我遇到此错误

Caused by: java.lang.IllegalArgumentException: Not a managed type: interface br.com.cloud.api.domain.dto.BffDTOInterface2
nfs0ujit

nfs0ujit1#

可以使用基于界面的投影。
例如,
1.创建本地查询,并将列命名为. select name as fullName, age as age from person
1.创建一个表示DTO的接口,并使用get-methods访问本地查询的每个别名。

interface MyDTO {
   String getFullName();
   Integer getAge();
}

1.现在,查询的返回类型可以是MyDTO

@Query(value = "select name as fullName, age as age from person", nativeQuery=true)
List<MyDTO> findMyDTO();
pes8fvy9

pes8fvy92#

是否可以使用没有实体的JpaRepository?
不,它不是,而且根据定义,它将完全挫败JPA的目的。
JPA是支持ORM(对象关系Map)的持久性规范,即分别将Java * 对象 * Map到数据库表的 * 条目/行 ,将Java类型Map到数据库表。
DTO(
Data Transfer Object *)与ORM无关,它有不同的用途(我建议您阅读this文章了解DTO与Entity的关系)-通过Java对象传输数据-它通常服务于中间层,用于将持久对象(@Entity)转换为要在Web层使用的对象(DTO),反之亦然。
如果您真的想避免持久层模型(@Entity),您可以使用JDBC抽象(例如Spring Data JDBC)、原生查询、JPQL、HQL或裸JDBC API(我不推荐)。

zzlelutf

zzlelutf3#

但你可以试试这个

您可以创建自己的自定义存储库类。首先,您将拥有一些调用存储库类的服务类。另请注意,我们为SQL查询的结果集提供了自定义模型。

@Service
public class CustomService {

    @Autowired
    private CustomRepository repository;

    public List<CustomResponse> getAllResult(String id) {

        List<Object[]> items = repository.getAllResult(id);
        List<CustomResponse> customResponseList = new ArrayList();
        for (Object[] item: items) {
            CustomResponse c = new CustomResponse();
            c.setTestValue1(String.valueOf(item[0]));
            c.setTestValue2(String.valueOf(item[1]));
            customResponseList.add(c);
        }

        return customResponseList;
    }

}

你的仓库类看起来像这样。

@Repository
public class CustomRepository {

    @Autowired
    private EntityManager entityManager;

    public List<Object[]> getAllResult(String id) {
        Query q = (Query) entityManager.createNativeQuery("SELECT\n" +
                "        users.user_id as user_id,\n" +
                "        users.email as user_email\n" +
                "        FROM Users\n" +
                "        WHERE users.parent_id = :parent_id;");
        q.setParameter("parent_id", id);
        List<Object[]> results = q.getResultList();
        return results;
    }

}

你也可能想有自己的模型。(像实体)

public class CustomResponse {

    private String testValue1;
    private String testValue2;

    public String getTestValue1() {
        return testValue1;
    }

    public void setTestValue1(String testValue1) {
        this.testValue1 = testValue1;
    }

    public String getTestValue2() {
        return testValue2;
    }

    public void setTestValue2(String testValue2) {
        this.testValue2 = testValue2;
    }
}
ha5z0ras

ha5z0ras4#

这是可能的。定义基本实体并具有一列。如果不希望它存在于数据库中,请在application. propeties中关闭dld-auto。
spring.jpa.休眠. ddl-自动=无

@Entity
    @Data
    public class BaseEntity {
        @Id
        private Long id;
    }

并且使用任何定制查询与任何其他具有BaseEntity的DAO扩展jpa存储库。

public interface EmployeeDao extends JpaRepository<BaseEntity, Long> {

    @Query(value = "select name from employee where employee_number = ?", nativeQuery = true)
    Optional<Employee> get(String employeeNumber);
}

public interface Employee{

    String getName();
   
}

相关问题