为了账号安全,请及时绑定邮箱和手机立即绑定

如何让EntityManager执行native sql

如何让EntityManager执行native sql

慕尼黑5688855 2023-03-31 14:52:04
首先,为您可能犯的语法错误道歉。我的英文不是很好。我正在创建一个表构造函数来创建动态表。我的问题是 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...抱歉,我编辑并添加编辑后的代码以对所有代码和版本进行排序:这是我的代码:@Servicepublic 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;    }
查看完整描述

2 回答

?
慕妹3146593

TA贡献1820条经验 获得超9个赞

@UtilityClass

我猜这是你的问题。取自龙目岛文档。

实用程序类无法实例化。通过使用 @UtilityClass 标记您的类,lombok 将自动生成一个私有构造函数,该构造函数会抛出异常,将您添加的任何显式构造函数标记为错误,并将该类标记为最终类。如果该类是内部类,则该类也被标记为静态。

我的猜测如下。Spring 只能将 bean 注入到 spring 管理的对象中。您的类TableGeoJsonGenerator不是托管 bean,因为 spring 无法实例化它。

您需要删除@UtilityClass并添加一个托管 bean 注释,例如@Service @Controller等等。

在 spring boot中定义 jpa 属性时application.properties,将自动为您创建一个EntityManager已定义的属性。

然后可以将其@Autowired放入任何spring managed bean. 您需要先管理您的班级。


查看完整回答
反对 回复 2023-03-31
?
PIPIONE

TA贡献1829条经验 获得超9个赞

你的方法 entityManagerFactory() 在哪里?

我认为: + 首先,创建 EntityManagerFactory

EntityManagerFactory entitymanagerfactory = Persistence.createEntityManagerFactory("your.package");

  • 然后,创建 entityManager :

    public static EntityManager getEntityManager() {   return entitymanagerfactory .createEntityManager(); }

然后 :

    ...

     EntityManager entityManager = getEntityManager();


     em.getTransaction().begin();

     ....


查看完整回答
反对 回复 2023-03-31
  • 2 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信