java - 检索 JPQL、EclipseLink 和 MySQL 中的实体

标签 java mysql jdbc eclipselink jpql

我已将一些 Book 实体保存在由 MySQL 创建的名为 Books 的数据库中。 这是我的 persistence.xml:

<persistence-unit name="mysqltest" transaction-type="RESOURCE_LOCAL">

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

<!-- list all classes -->
<class>it.mysql.beginner.User</class>
<class>it.mysql.beginner.Book</class>
<class>it.mysql.beginner.Kind</class>

<properties>
  <!-- some properties needed by persistence provider:
    - driver
    - db url
    - db user name
    - db user password -->
  <property name="javax.persistence.target-database" value="MySQL"/>
  <property name="javax.persistence.logging.level" value="INFO"/>
  <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
  <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/Books"/>
  <property name="javax.persistence.jdbc.user" value="lory"/>
  <property name="javax.persistence.jdbc.password" value="brookhaven12#"/>
  <property name="eclipselink.ddl-generation.output-mode" value="database" />

  <property name="eclipselink.ddl-generation" value="create-tables" />

  </properties>

</persistence-unit>

这是一个通用的 jpaDAO

public abstract class jpaDAO<E> {

protected Class<E> entityClass;

@PersistenceContext(unitName = "mysqltest")
protected EntityManager em;

@SuppressWarnings("unchecked")
public jpaDAO() {
    ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
    this.entityClass = (Class<E>) genericSuperclass.getActualTypeArguments()[0];
}

public List<E> findAll() {
    TypedQuery<E> q = em.createQuery("SELECT h FROM " + entityClass.getSimpleName() + " h", entityClass);
    return q.getResultList();
}
...

这是一个 BookDAO:

public class BookDAO extends jpaDAO<Book> {

public List<Book> findByAuthor(String author) {

    List<Book> bookList;

    TypedQuery<Book> query = em.createQuery("SELECT b FROM Book b WHERE b.author = author", entityClass);

            query.setParameter("author", author);

            bookList = query.getResultList();

    return bookList;

}
}

在我执行的主程序中:

List<Book> allBooks;
BookDAO bookDAO = new BookDAO();

allBooks = bookDAO.findByAuthor("Stephen King");

然后是 bookDao.findAll() 和 bookDao.findByAuthor("author") 但我得到 NullPointerException 所以我想列表 allBooks 是空的。 我不明白...数据库中存储有书籍,为什么它没有获取它们?

最佳答案

您正在调用new BookDAO()。但 BookDAO 构造函数和父类(super class)构造函数都不会初始化 em 字段。所以它是空的。因此,当您调用 em 上的方法时,您会收到 NullPointerException。

EntityManager 应该由容器注入(inject)(您没有指定是否在 EJB/CDI 容器内运行,或者是否使用 Spring)。但这只有在您从容器中获取 BookDAO 实例时才有可能。如果您自己实例化它,则容器不知道有关此对象的任何信息,因此无法注入(inject)此对象的任何字段。

因此,您的 BookDAO 应该被注入(inject)到它的调用者中(调用者本身应该由容器实例化)。

如果不知道调用者是什么以及您在哪个环境中运行,就不可能提供更多详细信息。

关于java - 检索 JPQL、EclipseLink 和 MySQL 中的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20133341/

相关文章:

Mysql group_concat 与 in() 函数

java - 动态显示结果集

java - ArrayDescriptor 是线程安全的吗?

java - Spring MVC 页面 HTTP 状态 400 和不正确的 URL

java - 选择Factory类的提供者

mysql - 在 WHERE 条件下划分 sql

php - mysql_connect 使用代理

java - 如何在 Angularjs 中对字符串进行编码?

java - 将 xjc 与 Ant 一起使用

java - 如何使用 Spring JDBCTemplate 从唯一约束违规中恢复?