我使用JPA CriteriaQuery构建我的动态Query并传入Spring Data Pageable对象:
sort=name,desc
Run Code Online (Sandbox Code Playgroud)
在后端,我的存储库中有一个方法来支持动态查询:
public Page<User> findByCriteria(String username, Pageable page) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> iRoot = cq.from(User.class);
List<Predicate> predicates = new ArrayList<Predicate>();
if (StringUtils.isNotEmpty(username)) {
predicates.add(cb.like(cb.lower(iRoot.<String>get("username")), "%" + username.toLowerCase() + "%"));
}
Predicate[] predArray = new Predicate[predicates.size()];
predicates.toArray(predArray);
cq.where(predArray);
TypedQuery<User> query = em.createQuery(cq);
int totalRows = query.getResultList().size();
query.setFirstResult(page.getPageNumber() * page.getPageSize());
query.setMaxResults(page.getPageSize());
Page<User> result = new PageImpl<User>(query.getResultList(), page, totalRows);
return result;
}
Run Code Online (Sandbox Code Playgroud)
注意:我只为演示目的放了一个参数.
但是返回的数据是未排序的,因此我想问一下在CriteriaQuery中实现Pageable的任何方法.
我有一个有关的问题javax.validation.constraints.NotNull annotation。在我的项目中,我确实有如下所示的类树:
@Inheritance(strategy = InheritanceType.JOINED)
class Ssss {
@ManyToOne
private Xxxx x;
public Xxxx getXxxx() {
return x;
}
}
@Inheritance(strategy = InheritanceType.JOINED)
class Yyyy extends Ssss {
@Override
//some not important annotations
public Xxxx getXxxx() {
return super.getXxxx();
}
}
@Inheritance(strategy = InheritanceType.JOINED)
class Zzzz extends Ssss {
@Override
//some not important annotations
@NotNull
public Xxxx getXxxx() {
return super.getXxxx();
}
}
Run Code Online (Sandbox Code Playgroud)
这三个类作为三个表存储在数据库中。对于架构创建,我正在使用Hibernate:
hibernate.hbm2ddl.auto=create
Run Code Online (Sandbox Code Playgroud)
它是一个预期的行为,Hibernate对增加NOT NULL对xxxx_object_id存储在父类生成的表场SSSS类似以下内容:??
我找不到有关休眠如何在继承的getter上使用@NotNull的任何相关信息。
有人可以帮我解决这个问题吗?
最好的祝福。 …
我刚刚开始使用 Querydsl,并且非常享受它为与 JPA 交互带来的改进。
我剩下的一个问题是为什么你必须用 包装like参数%?
我是否配置不当?考虑到有一种方法starts/endsWith,我假设like(str)会自动包装我的str.
但令我惊讶的是,我需要这样做:"%" + str + "%"得到我所期望的。
这是为什么?有没有更好的办法?
在将 Hibernate 与 Spring Boot JPA 结合使用时,我注意到,当尝试在扩展 Spring 的 CrudRepository 接口的存储库工件中实现更新方法时,必须将要更新的整个实体对象传递给这样的更新方法。直观上这似乎很浪费,我想知道什么是一种干净的方法来让 Spring Data/JPA 假设只有那些传入的值需要更新,而那些未传入的值则保持不变。
这是目前的服务方法,
public void updateCustomer(Long id, Customer customer) throws Exception {
customerRepository.save(customer);
}
Run Code Online (Sandbox Code Playgroud) 本课题涉及Spring Data JPA.
我需要一个带有Lower Function和Wildcards的(native)@Query.但是我不能让它发挥作用.
这是我正在寻找的过于简化的版本:
@Query(value = "SELECT * FROM CAR c WHERE LOWER(c.model) LIKE LOWER(%:model%)", nativeQuery = true)
List<Car> findByModelMatching( @Param("model") String model );
Run Code Online (Sandbox Code Playgroud)
更低(%:型号%) - >不工作!LOWER(:型号) - >有效!
我知道这样的查询可以很容易地重写为:
List<Car> findByModelContainingIgnoreCase( String model );
Run Code Online (Sandbox Code Playgroud)
但我不是在寻找一个命名查询.
我的问题是:如何在@Query中将LOWER(甚至UPPER)与WildCards结合起来!
干杯
我有下面的模型:文章可以有一些标签,标签可以在一些文章上.所以它是与3个表的多对多关系:
当我删除标签时,我想删除:
但我当然不想删除文章中的文章.
我怎样才能做到这一点 ?
我试试这个,但它不起作用:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
for (Article article : tagToDelete.getArticles()) {
article.getTags().remove(tagToDelete);
}
session.delete(tagToDelete);
Run Code Online (Sandbox Code Playgroud)
谢谢 !
@Entity
@Table(name="ARTICLE")
public class Article extends AbstractAuditedEntity {
@Id
@Column(name="ID", nullable=false)
private Long id;
@ManyToMany
@JoinTable(name="ARTICLE_TAG", joinColumns=@JoinColumn(name = "ARTICLE_ID"), inverseJoinColumns=@JoinColumn(name = "TAG_ID"))
private Set<Tag> tags = new HashSet<>();
public Article() {}
/** Getters & Setters */
}
@Entity
@Table(name="TAG")
public class Tag {
@Id
@Column(name="ID", nullable=false)
private Long id;
@ManyToMany(mappedBy="tags")
private Set<Article> articles = …Run Code Online (Sandbox Code Playgroud) 在删除操作期间,JpaRepository可以通知我,我要删除的实体不存在吗?
我知道删除方法不会返回布尔值,也不会抛出异常。
我也知道我可以简单地执行exists()或findOne(),然后执行删除,但我只是好奇。
有什么办法可以强制这样做吗?
我正在使用 Spring Boot 1.5.1。示例代码如下:
public HttpStatus deleteEventByTitle(String eventTitle) {
try {
eventRepository.deleteByTitle(eventTitle);
} catch (EntityNotFoundException e) { // just showing what I want to do
return HttpStatus.NOT_FOUND;
}
return HttpStatus.OK;
}
public interface EventRepository extends JpaRepository<Event, Long> {
void deleteByTitle(String title);
}
Run Code Online (Sandbox Code Playgroud) 我有一个名为Profile的类及其JPA存储库ProfileRepo我正在尝试使用findBy方法使用名字或中间名或姓氏以及使用contains子句查找名称.
public class Profile{
private String firstName;
private String middleName;
private String lastName;
//getters and setters
}
Run Code Online (Sandbox Code Playgroud)
我在JPA存储库中使用以下查询但它不接受该方法
List<Profile> findByLastNameContainingOrFirstNameContainingOrMiddleNameContainingAllIgnoreCase(String firstName,
String lastName,String midName);
Run Code Online (Sandbox Code Playgroud)
请帮忙.
在查看Spring Data JPA 存储库的查询创建时,我想知道如何重用参数。例如,如果我想做类似的事情,我将如何命名该方法:
@Query("select c from #{#entityName} c where c.lower <= ?1 and c.upper >= ?1")
E findByConversionFor(Double amount);
Run Code Online (Sandbox Code Playgroud)
该查询是否可以转换为 SpEL 方法名称(由查询构建器使用)?
要求将相同的值传递两次似乎是一种拼凑:
E findByLowerLessThanOrEqualAndUpperGreaterThanOrEqual(Double a, Double b); // where a==b
Run Code Online (Sandbox Code Playgroud) 我在文档中找不到具体的东西(https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation)并且在几个方面没有令人满意的答案博客。所以这里是我的问题。
我有表实体,如:
@Entity
@Table(name = "workstation")
public class Workstation
{
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "userid", nullable = false)
public User user;
}
Run Code Online (Sandbox Code Playgroud)
和用户表实体:
public class user
{
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "ID", unique = true, nullable = false)
public Integer id;
@Column(name = "age", nullable = false)
public int age
}
Run Code Online (Sandbox Code Playgroud)
现在我想在我的存储库中有一个这样的查询:
public interface WorkstationRepo extends CrudRepository<Workstation, Long> {
findByUserAgeLesserThan(int maxAge);
}
Run Code Online (Sandbox Code Playgroud)
意味着我想通过我的工作站实体找到所有未满特定年龄的用户。
没有@Query 注释是否可能?或者/它应该是什么样子?
spring ×8
java ×6
hibernate ×5
jpql ×3
spring-data ×2
db2 ×1
jointable ×1
jpa ×1
jpa-criteria ×1
many-to-many ×1
mappedby ×1
postgresql ×1
querydsl ×1
repository ×1
spring-boot ×1
spring-el ×1
sql ×1
wildcard ×1