Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring boot jpa:从与表架构无关的jpa查询返回自定义对象_Java_Spring Boot_Spring Data Jpa - Fatal编程技术网

Java spring boot jpa:从与表架构无关的jpa查询返回自定义对象

Java spring boot jpa:从与表架构无关的jpa查询返回自定义对象,java,spring-boot,spring-data-jpa,Java,Spring Boot,Spring Data Jpa,以下是我的配置: Java:1.8 Spring Boot::v2.3.1.0版本 我有以下型号/类别: 图书:图书课程如下。请注意,这不是一个与数据库中的表相关的实体,或者可以将其视为从多个表中获取的数据,这些表只具有必需的属性。简而言之,我不会为以下对象提供表模式 package com.myservice.model; public class Book { private long bookId; private String bookName; private

以下是我的配置: Java:1.8 Spring Boot::v2.3.1.0版本

我有以下型号/类别:

图书:图书课程如下。请注意,这不是一个与数据库中的表相关的实体,或者可以将其视为从多个表中获取的数据,这些表只具有必需的属性。简而言之,我不会为以下对象提供表模式

package com.myservice.model;

public class Book {
    private long bookId;
    private String bookName;
    private String bookType;
    private String author;


    public Book(long bookId, String bookName, String bookType, String author) {
        this.bookId = bookId;
        this.bookName = bookName;
        this.bookType = bookType;
        this.author = author;
    }

    public long getBookId() {
        return bookId;
    }

    public void setBookId(long bookId) {
        this.bookId = bookId;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getBookType() {
        return bookType;
    }

    public void setBookType(String bookType) {
        this.bookType = bookType;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

}
和上面一样,我还有一节课

package com.myservice.model;

public class Business {

    private String businessName;
    private String businessType;
    private String owner;


    public Book(String businessName, String businessType, String owner) {
        this.businessName = businessName;
        this.bookType = bookType;
        this.owner = owner;
    }


    public String getBusinessName() {
        return businessName;
    }

    public void setBusinessName(String businessName) {
        this.businessName = businessName;
    }

    public String getBusinessType() {
        return businessType;
    }

    public void setBusinessType(String businessType) {
        this.businessType = businessType;
    }

    public String getOwner() {
        return owner;
    }

    public void setOwner(String owner) {
        this.owner = owner;
    }

}
我需要输出如下对象

import java.util.List;

public class Configuration {

    private List<Book> books;
    private List<Business> businesses;
    private List<String> authors;
    private List<String> owners;

    // Constructor and getters/setters omitted for brevity

}
实施:

@Repository
@Transactional(readOnly = true)
public class ConfigurationRepositoryImpl implements ConfigurationRepositoryCustom {

    @PersistenceContext
    EntityManager entityManager;

    private List<Book> getBooks() {
        Query query = entityManager.createNativeQuery(
                "SELECT book_id, book, bookType, author FROM TABLE1 JOIN TABLE2 <Other criterias>"
                , Book.class
        );
        return query.getResultList();
    }

    private List<Business> getBusinesses() {
        List<Business> businesses = new ArrayList<>();
        businesses.add(new Business("ABC", "Constructions", "ABC PQR" ));
        businesses.add(new Business("XYZ", "Constructions", "PQR CCC" ));
        businesses.add(new Business("PQR", "Education", "ABC PQR" ));
        return businesses;
    }


    @Override
    public Configuration getConfigData() {
        List<Book> books = getBooks();
        List<Business> businesses = getBusinesses();
        
        List<String> authors = books.stream().map(Book::getAuthor).collect(Collectors.toList());
        List<String> owners = businesses.stream().map(Book::getOwner).collect(Collectors.toList());
        
        Configuration config = new Configuration(
                books,
                businesses,
                authors,
                owners
        );

        return config;
    }
}
现在,我的配置不是DB中的表,我仍然添加了属性“id”

接下来,我得到这个错误:

Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.myservice.model.Configuration
    at org.hibernate.metamodel.internal.MetamodelImpl.managedType(MetamodelImpl.java:582) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.metamodel.internal.MetamodelImpl.managedType(MetamodelImpl.java:85) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:75) ~[spring-data-jpa-2.3.1.RELEASE.jar:2.3.1.RELEASE]
    at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getEntityInformation(JpaEntityInformationSupport.java:66) ~[spring-data-jpa-2.3.1.RELEASE.jar:2.3.1.RELEASE]
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:229) ~[spring-data-jpa-2.3.1.RELEASE.jar:2.3.1.RELEASE]
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:179) ~[spring-data-jpa-2.3.1.RELEASE.jar:2.3.1.RELEASE]
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:162) ~[spring-data-jpa-2.3.1.RELEASE.jar:2.3.1.RELEASE]
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:72) ~[spring-data-jpa-2.3.1.RELEASE.jar:2.3.1.RELEASE]
Caused by: org.hibernate.MappingException: Could not determine type for: java.util.List, at table: configuration, for columns: [org.hibernate.mapping.Column(books)]
    at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:499) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:466) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
    at org.hibernate.mapping.Property.isValid(Property.java:227) ~[hibernate-core-5.4.17.Final.jar:5.4.17.Final]
我的数据库中当然没有这样的表


因此,基本上我正在寻找一种基于其他对象(少数来自DB,少数来自其他调用等)创建自定义(此处为配置)对象的方法,而该自定义对象不在DB中。那么如何实现同样的功能呢?

您不需要这个接口

import com.myservice.model.Configuration;

public interface ConfigurationRepositoryCustom {

    Configuration getConfigData();
}
public interface ConfigurationRepository extends JpaRepository<Configuration, Long>, ConfigurationRepositoryCustom {

}
public interface ConfigurationRepository扩展了JpaRepository、ConfigurationRepositoryCustom{
}

相反,可以直接在代码中使用
ConfigurationRepositoryCustom
,也可以使用名称
ConfigurationRepository
(无需添加自定义后缀)。

您不需要此接口

import com.myservice.model.Configuration;

public interface ConfigurationRepositoryCustom {

    Configuration getConfigData();
}
public interface ConfigurationRepository extends JpaRepository<Configuration, Long>, ConfigurationRepositoryCustom {

}
public interface ConfigurationRepository扩展了JpaRepository、ConfigurationRepositoryCustom{
}

相反,可以直接在代码中使用
ConfigurationRepositoryCustom
,也可以使用名称
ConfigurationRepository
(无需使用自定义后缀)。

您只能为@Entity class创建一个JpaRepository接口,这是原始“非托管类型”IllegalArgumentException的来源。由于
Configuration
不是数据库中的表,因此不需要
ConfigurationRepository
。只需删除它(以及配置中的@Entity注释和id字段),您只能为@Entity类创建一个JpaRepository接口,这就是原始“非托管类型”IllegalArgumentException的来源。由于
Configuration
不是数据库中的表,因此不需要
ConfigurationRepository
。只需删除它(以及配置中的@Entity注释和id字段)
public interface ConfigurationRepository extends JpaRepository<Configuration, Long>, ConfigurationRepositoryCustom {

}