我有一条SQL命令,该命令将字段更新到表中,并根据“ cat file.txt”填充该表。该文件有很多行,我希望稍后进入hibernate字段,但似乎从db hibernate中读取文件后,删除所有回车符。
这是我从shell脚本(bash)执行的脚本:
REQUEST_FILE=`cat file.txt`
echo "UPDATE table SET request_info='$REQUEST_FILE' WHERE id=1;" > ./after.sql
如果我做after.sql的猫,我会得到:
UPDATE table SET request_info='1-Start-Env Script for Env
2-insert done
3-update info done
4-all performed correctly' WHERE id=29;
这是数据库表结构:
Table: table
Columns:
id int(11) AI PK
submit_date datetime
request_type varchar(45)
request_info longtext
这是存储在db上的数据,行如何:
# id, submit_date,request_type, request_info
'29', '2019-02-11 04:55:21', 'check', '1-Start-Env Script for Env\n2-insert done\n3-update info done\n4-all performed correctly'
所以直到这一步,我都认为一切正常,因为字段包含“ \ n”
休眠类是通过以下方式完成的:
@Entity
@Table(name="table")
@NamedQuery(name="Table.findAll", query="SELECT u FROM Table u")
public class Table implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private int id;
@Column(name="request_info")
private String requestInfo;
@Column(name="request_type")
private String requestType;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="submit_date")
private Date submitDate;
当我访问requestInfo变量时,输出为:
1-Env的1-Start-Env脚本2-插入完成3-更新信息完成4-全部正确执行
此变量用于在JSF页面上单击按钮后创建文件:
HttpServletResponse response = (HttpServletResponse)
fc.getExternalContext().getResponse();
response.reset();
response.setContentType("text/plain");
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
OutputStream output = response.getOutputStream();
output.write(request.getRequestInfo().getBytes());
output.flush();
output.close();
如果我在System.out中看到正确的数据,那么我猜想是getBytes函数没有返回回车符:
System.out.println("file content:" +request.getRequestInfo());
输出:
file content:1-Start-Env Script for Env
2-insert done
3-update info done
4-all performed correctly
你有什么主意吗?谢谢
答案 0 :(得分:1)
您的问题是换行符。
在文件的新行中使用\n
代替\r\n
。
但是,这不能在所有平台上解决此问题,仅在您要测试的平台上解决即可。
有关换行符和不同平台的更多信息,请参见此处:
https://superuser.com/questions/374028/how-are-n-and-r-handled-differently-on-linux-and-windows
您还可以尝试以下操作:
output.write(request.getRequestInfo().replaceAll("(\\\\r\\\\n|\\\\n)", "\\\n"));
同样,您的servlet不知道浏览器在哪个平台上运行(Windows,Mac或其他),因此除非您要查看用户代理标头或某个系统或任何系统总是有问题,否则另一个。