基于Spring Data Document文档,我提供了一个存储库方法的自定义实现.自定义方法的名称是指域对象中不存在的属性:
@Document
public class User {
String username;
}
public interface UserRepositoryCustom {
public User findByNonExistentProperty(String arg);
}
public class UserRepositoryCustomImpl implements UserRepositoryCustom {
@Override
public User findByNonExistentProperty(String arg) {
return /*perform query*/;
}
}
public interface UserRepository
extends CrudRepository<?, ?>, UserRepositoryCustom {
public User findByUsername(String username);
}
Run Code Online (Sandbox Code Playgroud)
但是,也许是因为我选择了方法名称(findByNonExistentPropertyName),Spring Data尝试解析方法名称,并从中创建查询.当它找不到nonExistentProperty时User,会抛出异常.
可能的决议:
谢谢!
我们有一个以MySQL数据库和Spring为框架的项目.我是Spring的新手,希望实现数据库访问层,并发现有几个选项,比如
我已经浏览了stackoverflow中的各个帖子,并在网上进行了一些研究,但每个问题都有不同的答案支持不同的选项.此外,我确实看到提及现在不推荐使用Spring JDBC模板.
该应用程序每小时可能有大约1000个事务,大约有60%的读取和40%的写入.
任何人都可以帮我找到答案,哪3个选项适合哪个,为什么?或者,如果你能指出一些资源,那也将受到高度赞赏.
我正在尝试使用Spring Data Mongodb为我的mongodb文档实现版本控制系统.我以为我会利用Mongo生命周期事件
我想要做的是听取onBeforeSave并获取文档的原始版本,并获得两者之间的差异.
@Override
public void onBeforeSave(Table table, DBObject dbo) {
if (table.getId() != null) {
TableChange change = new TableChange();
Table beforeTable = mongoOperations.findById(table.getId(), Table.class);
if (!beforeTable.getName().equals(table.getName())) {
change.setName(table.getName());
}
MapDifference<String, Column> diff = Maps.difference(beforeTable.getColumns(), table.getColumns());
logger.debug(diff.entriesInCommon().toString());
logger.debug(diff.entriesDiffering().toString());
logger.debug(diff.entriesOnlyOnLeft().toString());
logger.debug(diff.entriesOnlyOnRight().toString());
table.addChange(change);
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我无法获得对mongoOperations的引用.它不断创建循环引用.是否我@Autowire:
Mongo配置:
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
<constructor-arg name="mongoConverter" ref="fooConverter" />
<property name="writeResultChecking" value="EXCEPTION" />
</bean>
<bean class="com.example.listener.document.TableListener"></bean>
Run Code Online (Sandbox Code Playgroud)
监听器:
public class TableListener extends AbstractMongoEventListener<Table> {
private static final Logger logger …Run Code Online (Sandbox Code Playgroud) 我正在使用带有mongodb的spring数据来存储二进制数据,例如图像等.我想维护一个版本字段以附加到url,以便从缓存图像中欺骗浏览器.
请参阅下面的文档基类:
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.Version;
import org.springframework.data.mongodb.core.index.Indexed;
public abstract class BaseDocument {
@Id
@Indexed(unique=true)
protected long id;
protected byte[] data;
protected String mimeType;
protected String filename;
protected String extension;
@Version
private Long version;
Run Code Online (Sandbox Code Playgroud)
我还有一个包装MongoOperations的存储库来保存我的文档.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class DocumentRepository implements IDocumentRepository {
@Autowired
private MongoOperations mongoTemplate;
@Override
public <D extends BaseDocument> void saveDocument(D document) {
mongoTemplate.save(document);
}
Run Code Online (Sandbox Code Playgroud)
为了实现版本控制,我做了一些狩猎,发现有一个@Version注释为spring mongo,但是已被弃用.然后我发现应该使用spring数据@Version注释.所以我继续使用弹簧数据@Version注释.
我期望发生的是每次保存文档时我的版本字段都会增加.我多次覆盖同一个文档,但我的版本字段并没有像我期望的那样增加.
我做错了什么或者我还需要做些什么吗?
使用@ModelAttribute和有@Valid什么好处?
哪些是差异?
可以一起使用它们吗?
我正在使用spring JdbcTemplate来执行sql查询:
JdbcTemplate template = new JdbcTemplate(ds);
template.execute(sqlInsert); //returns void
Run Code Online (Sandbox Code Playgroud)
我怎么能得到受影响的行数,因为该execute()方法返回void?
我有一个包含一个实体List,其由此lazy通过默认加载:
interface MyEntityRepository extends CrudRepository<MyEntity, Long> {
}
@Entity
public class MyEntity {
@Id
private Long id;
@OneToMany(mappedBy = "bar") //lazy by default
private List<Bar> bars;
}
@Entity
public class Bar {
//some more
}
Run Code Online (Sandbox Code Playgroud)
问题:如何在执行时强制执行加载repository.findOne(id)?
我在使用@MockBean注释时遇到问题.文档说MockBean可以替换上下文中的bean,但是我在单元测试中得到NoUniqueBeanDefinitionException.我看不出如何使用注释.如果我可以模拟repo,那么很明显会有多个bean定义.
我正在按照此处的示例进行操作:https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4
我有一个mongo存储库:
public interface MyMongoRepository extends MongoRepository<MyDTO, String>
{
MyDTO findById(String id);
}
Run Code Online (Sandbox Code Playgroud)
泽西岛资源:
@Component
@Path("/createMatch")
public class Create
{
@Context
UriInfo uriInfo;
@Autowired
private MyMongoRepository repository;
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response createMatch(@Context HttpServletResponse response)
{
MyDTO match = new MyDTO();
match = repository.save(match);
URI matchUri = uriInfo.getBaseUriBuilder().path(String.format("/%s/details", match.getId())).build();
return Response.created(matchUri)
.entity(new MyResponseEntity(Response.Status.CREATED, match, "Match created: " + matchUri))
.build();
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个JUnit测试:
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestMocks {
@Autowired
private TestRestTemplate restTemplate;
@MockBean
private MyMongoRepository mockRepo; …Run Code Online (Sandbox Code Playgroud) 我使用Spring Data并决定创建可以在Hibernate实体中使用的新自定义数据类型.我检查了文档,BasicType并根据此官方用户指南选择并实施它.
我希望能够在其类名下注册该类型,并且能够在实体中使用新类型而无需@Type注释.不幸的是,我无法引用MetadataBuilder或Hibernate配置来注册新类型.有没有办法在Spring Data中获取它?似乎Hibernate的初始化对用户是隐藏的,并且不能轻易访问.我们使用以下类来初始化JPA:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager",
basePackages = {
"..." // omitted
}
)
public class JpaConfiguration implements TransactionManagementConfigurer {
@Primary
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean configureEntityManagerFactory(
DataSource dataSource,
SchemaPerTenantConnectionProviderImpl provider) {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setPersistenceUnitName("defaultPersistenceUnit");
entityManagerFactoryBean.setDataSource(dataSource);
entityManagerFactoryBean.setPackagesToScan(
"..." // omitted
);
entityManagerFactoryBean.setJpaProperties(properties(provider));
entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
return entityManagerFactoryBean;
}
@Primary
@Bean(name = "transactionManager")
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new JpaTransactionManager();
}
private Properties properties(SchemaPerTenantConnectionProviderImpl …Run Code Online (Sandbox Code Playgroud) Spring Boot在这里。我想换我的头周围JpaRepositories,并Specifications在执行复杂查询的上下文中使用,当我在努力“通过舍本逐末”的几个项目看。
a的一个典型示例Specification如下:
public class PersonSpecification implements Specification<Person> {
private Person filter;
public PersonSpecification(Person filter) {
super();
this.filter = filter;
}
public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> cq,
CriteriaBuilder cb) {
Predicate p = cb.disjunction();
if (filter.getName() != null) {
p.getExpressions()
.add(cb.equal(root.get("name"), filter.getName()));
}
if (filter.getSurname() != null && filter.getAge() != null) {
p.getExpressions().add(
cb.and(cb.equal(root.get("surname"), filter.getSurname()),
cb.equal(root.get("age"), filter.getAge())));
}
return p;
}
}
Run Code Online (Sandbox Code Playgroud)
在此toPredicate(...)方法中,Root<Person>和CriteriaQuery代表什么?最重要的是,听起来您需要为要应用的每种过滤器类型创建一个Specification …
spring-data ×10
java ×6
spring ×5
hibernate ×3
mongodb ×3
spring-boot ×2
jpa-criteria ×1
mockito ×1
spring-mvc ×1
spring-orm ×1
versioning ×1