我正在使用,hibernate但我听说这spring-data-jpa是最好的,所以我尝试它,我很满意,直到我面对这个问题.
我在我的搜索表单中jsp有许多标准,用户可以选择他想要的任何内容.
那么这个请求的等价物是什么呢? spring-data-jpa
if(startDate!=null){
criteria.add(Expression.ge("date",startDate));
}
if(endDate!=null){
criteria.add(Expression.le("date",endDate));
}
if(volume!=null){
criteria.add(Expression.ge("volume",volume));
}
if ....
Run Code Online (Sandbox Code Playgroud) 我的问题是关于 Spring 数据生成查询的方式。
我有两个实体:消息,发件人
@Entity
public class Message extends BaseEntity {
@ManyToOne
protected Account sender;
}
Run Code Online (Sandbox Code Playgroud)
我有一个电话
messageDao.findBySenderId(Long id)
Run Code Online (Sandbox Code Playgroud)
结果是在两个表left outer join之间查询两个表中的所有列,但我的期望只是从消息表中选择where sender_id =传递的值。
那么有没有办法强制只选择第一个消息实体而不是加入另一个消息实体?我想要在 where 子句中使用 findBy 而不是自定义 @Query 的简单条件
我有如下查询:
select * from Products p where ? between p.effctDate and p.expDate
Run Code Online (Sandbox Code Playgroud)
我可以将上述查询转换为 spring 数据 jpa 查询方法吗?例如:
findByProductId(productId)
Run Code Online (Sandbox Code Playgroud)
或者我只需要使用@Query或命名查询来处理此类查询。在提出问题之前,我尝试先在这里搜索以及 spring 数据站点,但没有找到任何解决方案。任何帮助表示赞赏。
有没有办法在spring data mongodb中找到针对数据库运行的查询?
我知道在 JPA 的情况下这是可能的。所以只是想知道 Spring data MongoDB 中是否有类似的东西?
我有一个像下面这样的模型(假设为伪代码)
class Student {
@Id
private String id;
private String firstname;
.....;
@DBRef(lazy=true)
private College college
// getters and setters
}
class College {
@Id
private String id;
private String name;
// other attributes.
// getters and setters
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 @DBRef(lazy=true) 以便我不会加载与学生关联的大学。例如:如果我有一个名为 findByFirstname(String firstname) 的 Student 存储库方法,我可以在没有大学的情况下加载学生。但是,有时 我也想为学生加载大学。是否可以使用@Query 注释(org.springframework.data.mongodb.core.query.Query)编写带有自定义查询的存储库方法,我可以在其中加载学生(所有字段)以及相关的大学实例?
@Query( what should go here ?)
Student findStudentWithCollege(String firstname)
Run Code Online (Sandbox Code Playgroud)
如果不是,那么按需加载惰性文档的建议方法是什么?
根据文档
" DBRefs 也可以延迟解析。在这种情况下,实际对象或引用集合在第一次访问属性时解析。使用 @DBRef 的惰性属性来指定这一点。必需的属性也定义为延迟加载 DBRef 并使用因为构造函数参数也用延迟加载代理装饰,确保尽可能少地对数据库和网络施加压力。 ”我想这可能不适合加载姓氏为“史密斯”的学生的情况。 "以及检索到的每个学生的大学实例。
我正在为这个奇怪的错误而苦苦挣扎: a 的findById()方法CrudRepository返回Optional.empty,除非findAll()在使用 mysql 之前被调用。
例如
用户
@Entity
public class User {
@Id
@GeneratedValue
private UUID id;
public UUID getId() {
return id;
}
}
Run Code Online (Sandbox Code Playgroud)
用户库
public interface UserRepository extends CrudRepository<User, UUID> { }
Run Code Online (Sandbox Code Playgroud)
用户服务
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public UUID create() {
final User user = new User();
userRepository.save(user);
return user.getId();
}
@Transactional
public User find(@PathVariable UUID userId) {
// userRepository.findAll(); TODO without this functin …Run Code Online (Sandbox Code Playgroud) 这是我的父实体。注意:为简洁起见,删除 getter、setter、lombok 注释。
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@OneToMany(mappedBy = "board")
private Set<Story> stories = new HashSet<>();
}
Run Code Online (Sandbox Code Playgroud)
下面是我的子实体
@Entity
public class Story {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "board_id")
@JsonIgnore
private Board board;
}
Run Code Online (Sandbox Code Playgroud)
每个Board可以有多个Story,但每个都Story属于单个Board。
现在在我的服务中的某个地方,我正在这样做:
public void addBoard(BoardDTO boardDto){
// create a new board object which is …Run Code Online (Sandbox Code Playgroud) 您好,我有一个 Spring Boot 应用程序(2.3.1.RELEASE,ojdbc8),基本上它连接到 Oracle 数据库。
Spring Boot 应用程序在连接到 Oracle 数据库时启动 find。但是,当集成测试连接到 H2 嵌入式数据库时,它无法启动,并且我的一些查询失败并显示以下错误消息:
Caused by: java.lang.NullPointerException: null
at org.hibernate.hql.internal.NameGenerator.generateColumnNames(NameGenerator.java:27)
at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.generateColumnNames(SessionFactoryHelper.java:434)
Run Code Online (Sandbox Code Playgroud)
我设法通过在 application-test.yml 文件中添加以下代码行来使其工作:
spring:
jpa:
database-platform: org.hibernate.dialect.Oracle10gDialect
Run Code Online (Sandbox Code Playgroud)
请修改以下 application-test.yml 配置:
spring.datasource:
url: jdbc:h2:mem:db;Mode=Oracle;DB_CLOSE_DELAY=-1
username: sa
password: sa
driverClassName: org.h2.Driver
# added empty context path to override application.yml context path
server:
servlet:
contextPath:
spring:
jpa:
database-platform: org.hibernate.dialect.Oracle10gDialect
Run Code Online (Sandbox Code Playgroud)
应用程序启动良好并且集成成功完成,但是日志中可能会显示以下异常:
org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "ALL_SEQUENCES" not found; SQL statement:
select * from all_sequences [42102-200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:453) ~[h2-1.4.200.jar:1.4.200]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:429) ~[h2-1.4.200.jar:1.4.200]
at org.h2.message.DbException.get(DbException.java:205) ~[h2-1.4.200.jar:1.4.200] …Run Code Online (Sandbox Code Playgroud) 在 Spring data JPA 中,有一个@Sql注释对于设置持久层的集成测试非常方便。它可以在每次测试之前推出测试数据并在测试之后执行清理。
但是,我在模块中找不到它spring-data-r2dbc。有没有类似的东西可以轻松处理这个任务spring-data-r2dbc?
在网络上,我可以看到它spring-data-elasticsearch有一些您可以在 中定义的配置属性application.properties,例如:
spring.data.elasticsearch.repositories.enabled=true
spring.data.elasticsearch.cluster-nodes=localhost:9300
spring.data.elasticsearch.cluster-name=elasticsearch
elasticsearch.index.name=my_index
elasticsearch.user.type=user
Run Code Online (Sandbox Code Playgroud)
然而,在 IntelliJ 中,我可以看到,例如:
spring.data.elasticsearch.cluster-nodes=localhost:9300
spring.data.elasticsearch.cluster-name=elasticsearch
Run Code Online (Sandbox Code Playgroud)
...实际上现在已被弃用。但是,我似乎在文档中找不到任何内容spring-data-elasticsearch来列出可用的属性,或者应该用哪些属性来替换已弃用的属性。
欢迎任何帮助。提前致谢!
java spring spring-data spring-boot spring-data-elasticsearch
spring-data ×10
spring ×7
java ×4
jpa ×2
spring-boot ×2
criteria ×1
h2 ×1
hibernate ×1
jpql ×1
mongodb ×1
mysql ×1
set ×1
spring-mongo ×1
spring-test ×1