将 playframework 1.2.5 与现有数据库一起使用

Posted

技术标签:

【中文标题】将 playframework 1.2.5 与现有数据库一起使用【英文标题】:Using playframework 1.2.5 with an existing database 【发布时间】:2013-01-25 15:56:06 【问题描述】:

我正在尝试从 Oracle 10g 数据库中获取一些数据。所以我在 application.conf 文件中添加了 db 相关的详细信息,当我启动服务器时,在命令提示符下显示连接成功。

我创建了一个Entity类,数据库中存在一个类似于类名的表。

Query query = JPA.em().createQuery("select * from Emp");
    List<Emp> empList = query.getResultList();
    for(Emp employees : empList)
        System.out.println(employees.emp_name);

当我尝试运行代码时出现以下异常:

IllegalArgumentException occured : org.hibernate.hql.ast.QuerySyntaxException: unexpected token: * near line 1, column 8 [select * from models.Emp]

编辑:

如果我把代码改成这样:

List<Emp> empList = Emp.all().fetch();
    for(Emp employees : empList)
        System.out.println(employees.emp_name);

然后我得到一个异常:

JPAQueryException occured : Error while executing query from models.Emp: ORA-00904: "EMP0_"."ID": invalid identifier

这是我的名为 Emp.java 的模型类:

package models;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;

import play.data.validation.Required;
import play.db.jpa.Model;

@Entity
public class Emp extends Model 

@Id
@Column(name="Emp_Id")
public Integer id;
public String emp_name;
public Integer dept_id;
public Integer age;
public String sex;


这是 Oracle DB 中存在的 emp 表,其中包含一些数据:

EMP_ID  NUMBER. EMP_NAME VARCHAR2(20), DEPT_ID NUMBER, AGE NUMBER, SEX VARCHAR2(6)

由于我不知道这个问题的原因,所以我已经改写了这个帖子的标题。

请告诉我如何解决这个问题。

【问题讨论】:

【参考方案1】:

我会这样做: List&lt;Emp&gt; empList = Emp.findAll();

但我不认为这是真正的问题。问题出在到数据库表的映射中。您的错误信息:

`JPAQueryException occured : Error while executing query from models.Emp: ORA-00904:        "EMP0_"."ID": invalid identifier`

暗示实际查询尝试获取列“ID”而不是您想要的实际列(根据您的注释,@Column(name="Emp_Id"))。

注释未按预期工作。也许大写/小写字符有问题?

编辑回复:

您的模型类 EMP 从生成唯一标识符 id 的 playframework 父模型类继承。这可能会导致您的问题。

【讨论】:

我将模型类更改为@Id public Integer emp_id;,但仍然是同样的问题:(我不确定为什么Emp_Id 变成"EMP0_"."ID",如错误消息所示。另外,关于案例敏感性问题,SQL查询表名和列名不区分大小写对吧? 嗯,playframework 中的所有模型类都继承自一个具有 ID 字段的模型类。由于该类处理主键,因此您不必在模型对象中包含 emp_id。顺便提一句。您是在处理现有的数据库表,还是让 play/hibernate 为您生成它们? 我在 Oracle DB 中有一个名为“Emp”的现有表。仅从现有表中,我试图获取值。我不想播放/休眠生成任何表格。在运行上面的代码时,我看到一些改变查询被触发了对数据库......不知道为什么:(请帮助 您是否查看过play.db.jpa.GenericModel 与此线程中讨论的内容***.com/questions/11626004/… 可能会帮助您处理现有数据库。 感谢您的链接,但没有成功。我添加了这一行:jpa.ddl=noneevolutionplugin=disabled 并注释掉了 %test.jpa.ddl=create 行,但它仍然没有用。除了这些条目之外,我在文件中还有数据库配置详细信息。但我没有设置jpa.dialectjpa.debugSQL,这些都被注释掉了。请问这方面有什么帮助吗?【参考方案2】:

这样做的玩法是

List<Emp> empList = Emp.all().fetch();

【讨论】:

我正在尝试从现有表(由其他应用程序维护)中获取详细信息,但出现上述异常。请告诉我如何解决这个问题:( 我看到您通过使用 GenericModel 找到了数据库映射问题的答案。您更改了问题-您最初的问题是您的查询有问题-我回答了。第二个问题与不理解 Play 中的 Model 类带有硬编码的 id 字段有关。很高兴你让它正常工作。

以上是关于将 playframework 1.2.5 与现有数据库一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Log4j 自定义配置为每个级别分隔日志 - Playframework 1.2.5

与 Play Framework 1.2.5 JPA 的多对多关系

休眠 3.2.5 与 Play Framework 1.2.5

如何将 Akka Streams SourceQueue 与 PlayFramework 一起使用

Play Framework 1.2.5.1 和 1.2.6 版本之间的区别?

playframework 1.2.4 如何将 jar 与已经存在的 JPA 实体一起使用