MySQL使用Java、Spring和Hibernate查看CSV文件
我被要求从MySQL的视图中输出一个CSV文件。我目前正在编写的应用程序使用Spring和Hibernate创建数据库,但视图只是交给了我 Hibernate对此视图一无所知,但我想这样做:MySQL使用Java、Spring和Hibernate查看CSV文件,java,mysql,hibernate,spring,orm,Java,Mysql,Hibernate,Spring,Orm,我被要求从MySQL的视图中输出一个CSV文件。我目前正在编写的应用程序使用Spring和Hibernate创建数据库,但视图只是交给了我 Hibernate对此视图一无所知,但我想这样做: public List<Object> getCsvView() { return (List<Object>) getHibernateTemplate().find("from myView"); } public List getCsvView(){ return(Lis
public List<Object> getCsvView() {
return (List<Object>) getHibernateTemplate().find("from myView");
}
public List getCsvView(){
return(List)getHibernateTemplate().find(“从myView”);
}
我的猜测是,我可以映射一个本机查询,以便hibernate了解该视图。当我阅读文档时,这变得有点棘手:
您还可以将本机查询[…]映射到
要做到这一点,你需要描述
SQL结果集结构使用
@SqlResultSetMapping[…]
现在,我真的对映射结果的结构不感兴趣。我很高兴结构只是一堆物体
此外,他们可能随时改变这种观点。我真的对我的应用程序不感兴趣,甚至不知道它的视图
那么,在Spring/Hibernate的世界中,有没有一种简单的方法可以做到这一点,或者我是在以一种艰难的方式解决这个问题呢?只要在视图上执行一个本机查询,您就会得到一个
对象[]
的列表,其中每个列都有标量值。从文件中:
最基本的SQL查询是获取
标量(值)列表
这些将返回一个对象列表
带有标量值的数组(Object[]
)
对于CATS表中的每列。
Hibernate将使用ResultSetMetadata
推断实际的顺序和类型
返回的标量值的
以避免使用
ResultSetMetadata
,或者干脆
返回的内容更加明确,一个
可以使用addScalar()
:
此查询指定:
- SQL查询字符串
- 要返回的列和类型
这将返回对象数组,但
现在它不会用了
ResultSetMetadata
但将改为
显式获取ID、名称和
出生日期列分别作为
长,弦和短的距离
基础结果集。这也意味着
只有这三列是
返回,即使查询是
使用*可以返回比
列出了三列
可以省略该类型
所有或部分
标量
sess.createSQLQuery("SELECT * FROM CATS")
.addScalar("ID", Hibernate.LONG)
.addScalar("NAME")
.addScalar("BIRTHDATE")
这基本上与查询相同
以前是,但现在是ResultSetMetaData
用于确定名称和名称的类型
出生日期,其中ID的类型为
明确指定
java.sql.Types
如何从
ResultSetMetaData
映射到
休眠类型由
方言。如果未指定特定类型
已映射,或不会导致
预期类型,可以
通过呼叫来定制它
中的registerHibernateType
方言
看起来很适合在不了解视图的情况下生成CVS文件:)有趣。我同意这看起来正是我需要的。有没有一种更合适的方法可以让会话脱离“getHibernateTemplate()”?我可以将会话注入到dao impl中。我只是想看看是否有一种巧妙的方法可以用HibernateTemplate做同样的事情。可能是hibernateTemplate.getSessionFactory().openSession()@斯蒂芬诺:就个人而言,我不使用HibernateTemplate,我更喜欢。但是检查一下HibernateTemplate#executeFind
。非常好。这一点在整个调查中得到了证实。hibernate调用“select*fromMyView”,但在“没有JDBC类型的方言映射:-1”上出现了问题(我注意到视图中有一些长文本字段。我想我遇到了这个问题:
sess.createSQLQuery("SELECT * FROM CATS")
.addScalar("ID", Hibernate.LONG)
.addScalar("NAME", Hibernate.STRING)
.addScalar("BIRTHDATE", Hibernate.DATE)
sess.createSQLQuery("SELECT * FROM CATS")
.addScalar("ID", Hibernate.LONG)
.addScalar("NAME")
.addScalar("BIRTHDATE")