小编Nei*_*ton的帖子

JPA CriteriaQuery实现Spring Data Pageable.getSort()

我使用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的任何方法.

java spring hibernate spring-data-jpa jpa-criteria

5
推荐指数
3
解决办法
7584
查看次数

子类getter上的@NotNull影响父类表

我有一个有关的问题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 NULLxxxx_object_id存储在父类生成的表场SSSS类似以下内容:??

Postgres

我找不到有关休眠如何在继承的getter上使用@NotNull的任何相关信息。

有人可以帮我解决这个问题吗?
最好的祝福。 …

java postgresql hibernate jpa bean-validation

5
推荐指数
1
解决办法
1090
查看次数

Querydsl 喜欢惊喜

我刚刚开始使用 Querydsl,并且非常享受它为与 JPA 交互带来的改进。

我剩下的一个问题是为什么你必须用 包装like参数%

我是否配置不当?考虑到有一种方法starts/endsWith,我假设like(str)会自动包装我的str.

但令我惊讶的是,我需要这样做:"%" + str + "%"得到我所期望的。

这是为什么?有没有更好的办法?

java spring jpql querydsl spring-data

5
推荐指数
2
解决办法
5228
查看次数

Spring Boot JPA CrudRepository 选择性更新 - 仅部分属性

在将 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 hibernate spring-data spring-data-jpa spring-boot

5
推荐指数
1
解决办法
2497
查看次数

Spring @Query with Lower和Wildcards

本课题涉及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结合起来!

干杯

java sql spring wildcard spring-data-jpa

5
推荐指数
1
解决办法
1205
查看次数

如何使用JPA删除连接表中的行

我有下面的模型:文章可以有一些标签,标签可以在一些文章上.所以它是与3个表的多对多关系:

  • 文章
  • ARTICLE_TAG
  • 标签

当我删除标签时,我想删除:

  • TAG中的标签
  • 标签与ARTICLE_TAG中标记的文章之间的所有关系

但我当然不想删除文章中的文章.

我怎样才能做到这一点 ?

我试试这个,但它不起作用:

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)

many-to-many hibernate jointable mappedby

5
推荐指数
1
解决办法
3288
查看次数

JpaRepository - 删除方法 - 通知实体不存在

在删除操作期间,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)

java spring spring-data-jpa

5
推荐指数
1
解决办法
1万
查看次数

什么是对多个字段使用findBy的Spring Data JPA方法,并对所有字段使用Containing子句

我有一个名为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)

请帮忙.

java db2 spring repository spring-data-jpa

5
推荐指数
1
解决办法
2万
查看次数

如何在 Spring-Data-JPA 存储库中重用参数?

在查看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)

spring jpql spring-el spring-data-jpa

5
推荐指数
1
解决办法
2724
查看次数

Spring Boot JPA 过滤器按连接表

我在文档中找不到具体的东西(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 hibernate jpql spring-data-jpa

5
推荐指数
1
解决办法
5014
查看次数