将 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<Emp> 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=none
、evolutionplugin=disabled
并注释掉了 %test.jpa.ddl=create
行,但它仍然没有用。除了这些条目之外,我在文件中还有数据库配置详细信息。但我没有设置jpa.dialect
和jpa.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 一起使用