猿问

如何让EntityManager执行native sql

首先,为您可能犯的语法错误道歉。我的英文不是很好。


我正在创建一个表构造函数来创建动态表。我的问题是 EntityManager 为空,我不知道为什么。


我在读到您可以创建一个带有entityManagerFactory的 entityManager并传递我的 application.properties 中已有的参数。


或者我可以注入 PersistenceContext 但是当我尝试执行一个 sql 语句时,EntityManager 为空。


我该如何解决?


编辑:我做了你所说的一切,接下来展示:


LOGGER.DEBUG:


CREATE TABLE countries( table_id SERIAL, tsunami int8, mag float8, felt numeric, id varchar(255), time bigint,  primary key (table_id));


ERROR:


java.lang.NullPointerException: null

    at com.project.maps.util.TableGeoJsonGenerator.executeSQL...

抱歉,我编辑并添加编辑后的代码以对所有代码和版本进行排序:这是我的代码:


@Service

public class TableGeoJsonGenerator {


    private static final Logger LOGGER = LogManager.getLogger(SchemeService.class);


    @Autowired

    private EntityManager em;


    public TableGeoJsonGenerator() {

        super();

    }


    public void initTable(String name, List<String> columns, List<String> typeColumns, ArrayList<Object> rows) {

        createTableWithColumns(name, columns, typeColumns);

        addRowsInTable(rows);       

    }


    private void createTableWithColumns(String name, List<String> columns, List<String> typeColumns) {

        String SQL = "CREATE TABLE " + name + "( table_id int8 NOT NULL AUTO_INCREMENT, " + generateSqlColumns(columns, typeColumns) +" primary key (table_id));";

        LOGGER.debug(SQL);

        executeSQL(SQL);

    }


    private void addRowsInTable(ArrayList<Object> rows) {


    }


    public String generateSqlColumns(List<String> columns, List<String> typeColumns) {

        String DINAMIC_COLUMNS = "";

        for (int i=0; i<columns.size(); i++) {

            DINAMIC_COLUMNS += columns.get(i).toString() + " " + getPostgresqlValue(typeColumns.get(i).toString()) + ", ";

        }

        return DINAMIC_COLUMNS;

    }



慕尼黑5688855
浏览 135回答 2
2回答

慕妹3146593

@UtilityClass我猜这是你的问题。取自龙目岛文档。实用程序类无法实例化。通过使用 @UtilityClass 标记您的类,lombok 将自动生成一个私有构造函数,该构造函数会抛出异常,将您添加的任何显式构造函数标记为错误,并将该类标记为最终类。如果该类是内部类,则该类也被标记为静态。我的猜测如下。Spring 只能将 bean 注入到 spring 管理的对象中。您的类TableGeoJsonGenerator不是托管 bean,因为 spring 无法实例化它。您需要删除@UtilityClass并添加一个托管 bean 注释,例如@Service&nbsp;@Controller等等。在 spring boot中定义 jpa 属性时application.properties,将自动为您创建一个EntityManager已定义的属性。然后可以将其@Autowired放入任何spring managed bean.&nbsp;您需要先管理您的班级。

PIPIONE

你的方法 entityManagerFactory() 在哪里?我认为: + 首先,创建 EntityManagerFactoryEntityManagerFactory entitymanagerfactory = Persistence.createEntityManagerFactory("your.package");然后,创建 entityManager :public static EntityManager getEntityManager() { &nbsp; return entitymanagerfactory .createEntityManager(); }然后 :&nbsp; &nbsp; ...&nbsp; &nbsp; &nbsp;EntityManager entityManager = getEntityManager();&nbsp; &nbsp; &nbsp;em.getTransaction().begin();&nbsp; &nbsp; &nbsp;....
随时随地看视频慕课网APP

相关分类

Java
我要回答