Hibernate继续向stdout发送SQL跟踪,当隐藏在JPA适配器后面时,我无法弄清楚如何更改Hibernate配置属性.这是entityManagerFactory的Spring bean:
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="ssapDataSource"/>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >
<property name="showSql" value="false"/>
</bean>
</property>
</bean>
Run Code Online (Sandbox Code Playgroud)
即使将showSql属性设置为false,Hibernate也会继续打印SQL.
我已经尝试使用"hibernate.show_sql = false"在我的类路径中创建一个hibernate.properties文件,但它也没有选择它.
你如何/打印一个(类型)查询背后的JPQL查询字符串,即经过参数设置?(例如用于调试目的)
一个简单toString()
似乎没有做的伎俩......
谢谢
我想在使用Hibernate时看到我的SQL查询的实际参数.我将其添加到我的logback.xml中以查看查询(带有问号):
<logger name="org.hibernate.type" level="TRACE" />
Run Code Online (Sandbox Code Playgroud)
但没有效果.
是否需要特殊配置?
OnConsoleStatusListener向我显示正确的配置
23:48:15,246 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting level of logger [org.hibernate.type] to TRACE
Run Code Online (Sandbox Code Playgroud)
但没有来自org.hibernate.type包的输出.
我正在使用Spring和Jpa.
如何调试使用JPA 2.0
CriteriaBuilder
?构建的查询?有没有办法打印出正在执行的查询?
我使用的开发Web应用程序NetBeans
,MySql
,GlassFish
.我会避免在调试模式下启动MySql,因为它也用于其他应用程序.JPA提供商是EclipseLink
.
我有一个Spring控制器方法的问题.它实际上对导致StaleObjectStateException的同一实体进行了两次更新.
问题是,当我检索Member实例时,我认为它会以某种方式导致更新(请参阅//UPDATE ONE
)Advertisement实例(实际上并不需要),当我更新Advertisement实例(请参阅参考资料//UPDATE TWO
)时,它会抛出StaleObjectStateException.
我的问题是如何防止在我的情况下发生此异常(请记住我使用Spring Data JPA)?
这是Member
实体类:
@Entity
public class Member {
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "member")
private List<Advertisement> advertisements;
...
Run Code Online (Sandbox Code Playgroud)
并在Advertisement
实体类中:
@NotNull
@ManyToOne(fetch = FetchType.LAZY)
private Member member;
Run Code Online (Sandbox Code Playgroud)
这是控制器方法:
@RequestMapping(value = "/family/advertisement/edit", method = RequestMethod.POST, produces = "text/html")
public String editFamilyAdvertisement(@ModelAttribute @Validated(value = Validation.AdvertisementCreation.class) FamilyAdvertisementInfo familyAdvertisementInfo, BindingResult bindingResult, Model model) {
Member member = memberService.retrieveCurrentMember();//UPDATE ONE
if (!advertisementService.advertisementBelongsToMember(familyAdvertisementInfo.getFamilyAdvertisement(), member)) {
throw new IllegalStateException("advertisement …
Run Code Online (Sandbox Code Playgroud) 我试图学习和理解JPA标准.到目前为止,我在SQL方面非常有能力,并且在Hibernate Criteria和HQL方面非常有能力.
我试图用一个OR语句做一个相当简单的选择.
在纯SQL中,我的选择如下所示:
SELECT * FROM CHANGED_LOG
WHERE key1 = 52540 AND objectCode = 'Order'
OR key1 = 48398 AND objectCode = 'Package'
Run Code Online (Sandbox Code Playgroud)
这给了我每一行key1 = 52540和objectCode等于Order AND的每一行key = 48398和objectCode等于Package.这正是我想要的.
所以尝试用JPA标准(这看起来格外复杂......),我到目前为止最好的猜测是:
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<ChangedLogBean> query = builder.createQuery(ChangedLogBean.class);
Root<ChangedLogBean> from = query.from(ChangedLogBean.class);
CriteriaQuery<ChangedLogBean> select = query.select(from);
Predicate orderChangedLogBeans = builder.conjunction();
builder.and(orderChangedLogBeans, builder.equal(from.get("key1"), orderId));
builder.and(orderChangedLogBeans, builder.equal(from.get("objectCode"), ChangedLogBean.ObjectType.OrderBean));
Predicate packageChangedLogBeans = builder.conjunction();
builder.and(packageChangedLogBeans, builder.equal(from.get("key1"), packageId));
builder.and(packageChangedLogBeans, builder.equal(from.get("objectCode"), ChangedLogBean.ObjectType.PackageBean));
Predicate orderOrPackage = builder.disjunction();
orderOrPackage.getExpressions().add(orderChangedLogBeans);
orderOrPackage.getExpressions().add(packageChangedLogBeans);
query.where(orderOrPackage);
return entityManager.createQuery(select).getResultList();
Run Code Online (Sandbox Code Playgroud)
哇.一个简单查询的很多行...但是,这仍然从数据库向我的每一行返回.
我在这做错了什么?
谢谢你所有有用的答案:)
我有一个spring数据JPA存储库(位于postgres db上),我有时需要使用nativeQuery = true选项来使用本机查询。
但是,在当前情况下,我需要传递一个order字段,并且这样做是这样的:
电话..
targetStatusHistoryRepository.findSirenAlarmTimeActivation([uuid,uuid2],"activation_name DESC", 0, 10)
Run Code Online (Sandbox Code Playgroud)
..回购方法
@Query(
nativeQuery = true,
value = """select
a.name as activation_name,
min(transition_from_active_in_millis),
max(transition_from_active_in_millis),
avg(transition_from_active_in_millis) from target_status_history t, activation_scenario a
where t.activation_uuid=a.activation_scenario_id and t.transition_from_active_in_millis > 0 and t.activation_uuid in (:activationUUIDs) group by a.name,t.activation_uuid
order by :orderClause offset :offset limit :limit """
)
List<Object[]> findSirenAlarmTimeActivation(@Param("activationUUIDs") List<UUID> activationUUIDs,
@Param("orderClause") String orderClause, @Param("offset") int offset, @Param("limit") int limit )
Run Code Online (Sandbox Code Playgroud)
我用DESC写了一个单元测试,然后用ASC调用,反之亦然,看来第一个调用是什么,第二个给出了相同的结果。
jpa ×6
hibernate ×4
spring ×4
criteria-api ×2
java ×2
criteria ×1
debugging ×1
eclipselink ×1
jpql ×1
logback ×1
mysql ×1
native ×1
postgresql ×1
spring-data ×1
sql ×1