在Hibernate中有一个规定,您可以从Criteria 如何从Hibernate Criteria API获取SQL(*not*for logging)中获取查询,但我想从Hibernate获取更新/删除查询saveOrUpdate,delete(Object)那么有什么选择吗?
使用mysemma的querydsl显示自动生成的sql查询的任何最佳方式,以便可以轻松查看这些sql查询,并且在使用querydsl时调试sql查询变得容易。
例如: from(qCustomer).where(qCustomer.custId.eq("1"));
我需要知道幕后生成的 sql 并希望记录日志以便我可以轻松调试我的应用程序。
为了避免sql注入,通常可以在HQL中使用位置参数和命名参数,因为它在这里进行演示,而stackoverflow也有样本.我想知道在使用时可以采取哪些步骤Criteria.请提供示例代码或有用链接的任何帮助.
编辑
当我们保存对象时呢?比方说,该对象可能有一个String变量,有些人可以为它分配一个易受攻击的SQL查询.
myObject.setName(somevulnerablesql); session.save(myObject);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们是否必须在分配给对象之前单独检查用户输入?或任何其他步骤,以避免此类SQL注入?
所以我有一个Users表,Projects表和User_Roles表.我有一个用户连接到2个项目,但是当我只有一个角色时,它会返回这2个项目,但如果我有2个角色,则返回4个角色(2x2个项目).我如何防止这种情况发生
这是我返回用户项目列表的代码
@Override
public List<Project> retrieve(User user) {
Criteria criteria = super.createCriteria();
criteria.addOrder(Order.desc("date"));
criteria.createCriteria("users").add(Restrictions.eq("id", user.getId()));
return (List<Project>) criteria.list();
}
Run Code Online (Sandbox Code Playgroud)
用户类中的映射
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "Users_Projects",
joinColumns = @JoinColumn(name = "UserID"), inverseJoinColumns = @JoinColumn(name = "ProjectID"))
public List<Project> getProjects() {
return projects;
}
@ElementCollection(fetch = FetchType.EAGER)
@Enumerated(EnumType.STRING)
@Column(name = "RoleType")
@JoinTable(name = "User_Roles", joinColumns = @JoinColumn(name = "UserID"))
public Set<Role> getRoles() {
return roles;
}
Run Code Online (Sandbox Code Playgroud)
有什么建议在这里有什么问题吗?
TNX
我一直在努力在我的项目中捕获一个非常复杂的JPA查询的确切SQL以进行优化,但到目前为止我无法这样做.我尝试了以下方法:
1)通过在logback.xml中添加以下内容并启用show_SQL,尝试通过logback启用hibernate日志
<logger name="org.hibernate.type" level="ALL" />
<logger name="org.hibernate" level="TRACE">
<appender-ref ref="fdpAdminAppender" />
</logger>
Run Code Online (Sandbox Code Playgroud)
2)尝试使用P6spy-2驱动程序与Jboss AS7和postgres,但只是无法使其工作.它给出了以下例外.
com.p6spy.engine.spy.P6SpyDriver cannot be cast to javax.sql.XADataSource
Run Code Online (Sandbox Code Playgroud)
3)在JBoss AS 7中启用了内置数据源间谍,它确实有效.但是日志显示的数据太多,所有这些对我来说都是无用的,因为它们再次将值附加为"?".即使我可以在这里获得完整的SQL语句,我的问题也将得到解决.
到目前为止,我已经成功完成了第3步,但要么我错过了某些东西,要么就是这样,无论是哪种情况,我的实际目的都没有得到解决.所以请有人帮我从JPA获取实际的SQL查询.我并不关心如何得到它,我只需要得到它.我经历过需要在开发过程中多次验证JPA生成的实际SQL.很奇怪为什么没有标准的方法来做到这一点.
我有一个JPA 2 Web应用程序(Struts 2,Hibernate 4仅作为JPA实现).
当前的要求是将(非id)数字顺序字段(仅对某些行填充)添加到现有实体.根据特定条件插入新行时,我需要将新字段设置为its highest value + 1或NULL.
例如:
ID NEW_FIELD DESCRIPTION
--------------------------------
1 1 bla bla
2 bla bla <--- unmatched: not needed here
3 bla bla <--- unmatched: not needed here
4 2 bla bla
5 3 bla bla
6 4 bla bla
7 bla bla <--- unmatched: not needed here
8 5 bla bla
9 bla bla <--- unmatched: not needed here
10 6 bla bla
Run Code Online (Sandbox Code Playgroud)
在旧的SQL中,它将是这样的:
INSERT INTO myTable ( …Run Code Online (Sandbox Code Playgroud) 如何查看Hibernate生成的DDL SQL,以便从JPA映射构建模式?我正在使用嵌入式HSQL数据库.
我尝试了以下内容,但没有一个在Spring-Boot 1.3.5.RELEASE中工作.
那些只显示Hibernate为查询发出的sql.由于以下属性,我正在寻找由Hibernate发布的DDL模式sql:
spring.jpa.hibernate.ddl-auto=create-drop
Run Code Online (Sandbox Code Playgroud) 我正在使用p6spy来记录我的程序生成的sql语句.输出的spy.log文件的格式如下所示:
current time|execution time|category|statement SQL String|effective SQL string
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有人知道是否有办法改变spy.properties文件并且只有最后一列,即有效的SQL字符串,输出到spy.log文件?我查看了属性文件,但没有找到任何似乎支持这个的东西.
谢谢!
我正在使用hibernate,我有一个实体
@Entity
@Table(name = "MyEntity")
Class MyEntity {
@Id
@GeneratedValue
private long id;
@Column(name = "NAME")
private String name;
//some more attributes here
@OneToOne
@JoinColumn(name = "PARENT_ID")
MyEntity parent;
}
Run Code Online (Sandbox Code Playgroud)
我在数据库中有一条记录
id | name | parent_id
125 | n1 | null
Run Code Online (Sandbox Code Playgroud)
当我试图用hibernate Query获取此记录时
Select e.id,e.name,e.parent.name from MyEntity e where e.id =125
Run Code Online (Sandbox Code Playgroud)
这个查询返回零记录.因为父在这里是null,所以有任何方法来处理这种情况.谢谢你的建议.
hibernate ×8
java ×4
sql ×3
jpa ×2
p6spy ×2
annotations ×1
criteria ×1
duplicates ×1
jboss7.x ×1
jpa-2.0 ×1
mapping ×1
mysema ×1
querydsl ×1
spring ×1
spring-boot ×1