【发布时间】:2013-12-06 15:40:47
【问题描述】:
我在 MySQL 创建的名为 Books 的数据库中保留了一些 Book 实体。 这是我的 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 是空的。 不明白……数据库里有书,怎么查不到?
【问题讨论】:
-
你到底为什么要捕获 NullPointerException? NullPointerException 是一个错误。抓住它会隐藏错误,而不是解决它。不要捕获 NullPointerException。永远不要从返回集合的方法中返回 null。并修复您的查询和方法:它不使用作者参数。
-
我已经写了你所说的更正但是,即使我没有捕捉到异常,这也是我从控制台读到的:
-
it.mysql.beginner.dao.BookDAO.findByAuthor(BookDAO.java:20) 在 it.mysql.beginner.Main.main(Main) 的线程“main”中出现异常 java.lang.NullPointerException .java:138)
-
执行此操作时似乎收到此 NullPointerException:
-
TypedQuery
query = em.createQuery("SELECT b FROM Book b WHERE b.author = author", entityClass);
标签: java mysql jdbc eclipselink jpql