有谁知道如何处理由Spring Boot创建的Hibernate SessionFactory?
我正在使用Spring Data JPA(Hibernate作为我的JPA提供程序)并且想要定义exists
附加了HQL查询的方法:
public interface MyEntityRepository extends CrudRepository<MyEntity, String> {
@Query("select count(e) from MyEntity e where ...")
public boolean existsIfBlaBla(@Param("id") String id);
}
Run Code Online (Sandbox Code Playgroud)
当我运行此查询时,我得到了一个java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Boolean
.
HQL查询如何使其工作?我知道我可以简单地返回一个Long值,然后检查我的Java代码是否count > 0
,但是这个解决方法不应该是必要的,对吧?
我想在存储库层中编写一些查询方法.此方法必须忽略null参数.例如:
List<Foo> findByBarAndGoo(Bar barParam, @optional Goo gooParam);
Run Code Online (Sandbox Code Playgroud)
此方法必须通过以下条件返回Foo:
bar == barParam && goo == gooParam;
Run Code Online (Sandbox Code Playgroud)
如果gooParam不为null.如果gooParam为null,则条件更改为:
bar == barParam;
Run Code Online (Sandbox Code Playgroud)
有什么解决方案吗?有人能帮我吗?
我有一个表实体映射为:
@Entity
public class ItemsToRegister implements Serializable{
@Id
@Column(name = "ID_ITEM_TO_REGISTER")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
.....
Run Code Online (Sandbox Code Playgroud)
当我尝试在数据库中插入新记录时,表名被小写翻译为:items_to_register,但我的表名是ITEMS_TO_REGISTER如何在不更改MySql配置的情况下修复我的问题?(my.cnf中)
我在我的application.properties文件中:
spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy
Run Code Online (Sandbox Code Playgroud) 我正在使用Spring Data JPA,我有一个PagingAndSortingRepository<Contact, Long>
使用JPASpecificationExecutor<Contact>
.我将一个Specification
和一个Pageable
实例传递给.findAll()
此存储库的方法以获取Page<Contact>
.
但是,我的Contact
实体有很多额外的字段和映射,我不需要在前端.所以,我有一个ContactDto
只包含必要的字段,我也可以从一个转换方法Contact
来ContactDto
.
private ContactDto convertToContactDto(Contact contact) {
//do the conversion
}
Run Code Online (Sandbox Code Playgroud)
我将如何使用此转换方法将其转换Page<Contact>
为Page<ContactDto>
?
我可以得到它的内容Page<Contact>
并像这样进行转换.
final Page<Contact> contactPage = pagingAndSortingContactRepository
.findAll(ContactSpecification.findByFirstNmLike(firstNm), pageable);
final Collection<ContactDto> contactDtos = contactPage.getContent()
.stream()
.map(this::convertToContactDto)
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
但后来我留下了一个Collection
而不是一个Page
,我不知道如何把它Collection
变成了内容Page
.有没有办法做到这一点?或者是否有另一种方法来调用Page<Contact>
实例本身的转换?
我使用的是使用Hibernate 5.0.11的Spring Boot 1.4.1.最初我使用application.properties
如下配置数据源:
spring.datasource.uncle.url=jdbc:jtds:sqlserver://hostname:port/db
spring.datasource.uncle.username=user
spring.datasource.uncle.password=password
spring.datasource.uncle.dialect=org.hibernate.dialect.SQLServer2012Dialect
spring.datasource.uncle.driverClassName=net.sourceforge.jtds.jdbc.Driver
Run Code Online (Sandbox Code Playgroud)
我用"叔叔"配置它,因为这将是我将配置的多个数据源之一的名称.我根据Spring文档配置了这样的数据源:
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource.uncle")
public DataSource uncleDataSource() {
return DataSourceBuilder.create().build();
}
Run Code Online (Sandbox Code Playgroud)
在这一点上一切正常.
我创建了一个@Entity
没有任何@Column
注释的类,让Hibernate找出列名,例如,如果我有一个名为Java的属性idBank
,Hibernate将自动假设列名为id_bank
.这在生成ddl,运行SQL语句等时使用.我想利用此功能,因为我将拥有大量实体类,并且不希望创建和维护所有@Column注释.在这一点上,这很好.
然后我添加了另一个这样的数据源:
spring.datasource.aunt.url=jdbc:sybase:Tds:host2:port/db2
spring.datasource.aunt.username=user2
spring.datasource.aunt.password=password2
spring.datasource.aunt.dialect=org.hibernate.dialect.SybaseDialect
spring.datasource.aunt.driverClassName=com.sybase.jdbc4.jdbc.SybDriver
Run Code Online (Sandbox Code Playgroud)
......还有这个,遵循Spring文档设置多个数据源.显然,一旦定义了第二个数据源,它就无法配置默认bean,你必须定义自己的EntityManager
和TransactionManager
.所以除了上面配置的数据源之外,我还添加了以下配置:
@Bean
@Primary
PlatformTransactionManager uncleTransactionManager(@Qualifier("uncleEntityManagerFactory") final EntityManagerFactory factory) {
return new JpaTransactionManager(factory);
}
@Bean
@Primary
LocalContainerEntityManagerFactoryBean uncleEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(uncleDataSource())
.packages(Uncle.class)
.persistenceUnit("uncle")
.build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.aunt")
public DataSource auntDataSource() {
return …
Run Code Online (Sandbox Code Playgroud) Hibernate的Criteria
API具有Restrictions.ilike
以下合同的功能:
不区分大小写的"喜欢",类似于Postgres ilike运算符
这很酷.但是同一个班级也有like
功能,合同含义要多得多:
对命名属性应用"like"约束
例
Criteria cr = session.createCriteria(Employee.class);
// To get records having fistName starting with zara
cr.add(Restrictions.like("firstName", "zara%"));
// Case sensitive form of the above restriction.
cr.add(Restrictions.ilike("firstName", "zara%"));
Run Code Online (Sandbox Code Playgroud) 这可能不是最好的问题,但我注意到Spring引导有2个Spring JPA.他们有什么不同.目前我正在尝试与hibernate一起设置SpringBoot 1.5.3项目.我记得我之前使用spring-boot-starter-data-jpa设置了Springboot和JPA.
我见过的大多数在线示例以及starter.spring.io都为spring jpa提供了以下依赖项.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
但是在一个现有的项目中,我遇到了spring-data-jpa
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>1.11.4.RELEASE</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
做一些谷歌没有给我,如果他们是不同的.
在我之前的所有项目中,我添加JPA虽然是JPA 2.1/Hibernate,但这就是为什么我有点不确定在我的新SpringBoot应用程序中使用哪两个.
我认为这是一个非常基本的问题 -
关于这个错误有几种问题,但前5个结果中没有一个会增加Spring的细微差别.
我有一个在春天写的REST-ful webapp的开头.我正在尝试将其连接到数据库.
我有一个名为Workspace的实体,我正在尝试使用bean的弹簧注入(正确的术语?)来保存工作区实体的实例
package com.parrit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.parrit.models.Workspace;
import com.parrit.models.WorkspaceRepository;
@RestController
@RequestMapping("/workspace")
public class WorkspaceController {
@Autowired
private final WorkspaceRepository repository;
@RequestMapping(method = RequestMethod.POST)
void save( @RequestBody String workspaceHTML) {
Workspace ws = new Workspace();
ws.setHTML(workspaceHTML);
repository.save(ws);
}
}
Run Code Online (Sandbox Code Playgroud)
我的错误在于存储库变量private final WorkspaceRepository repository
.编译器抱怨它可能没有被初始化并且尝试运行应用程序会产生相同的结果.
如何将此存储库对象的实例添加到控制器中以对其执行保存操作?
我正在读"用于Web应用程序的专业Java - Nicholas S. Williams"这本书的例子有Spring Data JPA的这个配置:
@Bean
public DataSource customerSupportDataSource()
{
JndiDataSourceLookup lookup = new JndiDataSourceLookup();
return lookup.getDataSource("jdbc/CustomerSupport");
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
{
Map<String, Object> properties = new Hashtable<>();
properties.put("javax.persistence.schema-generation.database.action",
"none");
properties.put("hibernate.ejb.use_class_enhancer", "true");
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");
LocalContainerEntityManagerFactoryBean factory =
new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(adapter);
factory.setDataSource(this.customerSupportDataSource());
factory.setPackagesToScan("com.wrox.site.entities",
"com.wrox.site.converters");
factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
factory.setValidationMode(ValidationMode.NONE);
factory.setLoadTimeWeaver(this.loadTimeWeaver); // TODO: remove when SPR-10856 fixed
factory.setJpaPropertyMap(properties);
return factory;
}
@Bean
public PlatformTransactionManager jpaTransactionManager()
{
return new JpaTransactionManager(
this.entityManagerFactoryBean().getObject()
);
}
Run Code Online (Sandbox Code Playgroud)
但我一直在使用XML进行配置,我无法弄清楚如何将其转换为XML,到目前为止我已经知道了
<jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/test"/>
<bean id="transactionManager" …
Run Code Online (Sandbox Code Playgroud) hibernate ×7
java ×7
spring ×6
spring-data ×5
spring-boot ×3
jpa ×2
jpql ×2
mysql ×1
spring-mvc ×1
sql ×1
xml ×1