Spring Data JPA - 传递列名和值作为参数 [英] Spring Data JPA - Pass column name and value as parameters

查看:1752
本文介绍了Spring Data JPA - 传递列名和值作为参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只想知道如何将列名及其值传递给Spring Data JPA中的@Query注释。

基本上列名是静态的,我们习惯于将每一列作为Entity类中的一个元素。但是在这里我想要一些不同的东西,这里的列名将是动态的,我将把这个值作为参数传递给在存储库中定义的方法。

- 日历



- id,PersonName,1,2,3 ...... 31



以上是表结构,1,2,3,..... 31是表示日历日的列名,我们在该列中有值。我使用Spring Data JPA从数据库中获取数据。
在这里,我只想获取特定日期的人名。
下面给出函数库中定义的函数。

  @Query(select c from Calendar c where:calendarDay =值)
列表<日历> getPersonName(@Param(calendarDay)字符串calendarDay,@Param(value)字符串值);

这不适合我。
任何帮助将不胜感激。

解决方案

查看 sping data规格。您可以在这里找到您的解决方案!

阅读文档可以看到,如果 Calendar 是您的域名(我会尝试为我的域名找到一个不同的名称域中,有一个日历课程Java SE已经),那么你可以使用类似上面的东西,

  @Repository 
public interface CalendarRepository扩展了JpaRepository< Calendar,Integer>,JpaSpecificationExecutor< Calendar> {
}


公共类CalendarSpecification实现了规范<日历> {

private String randomColumnName; //一个varchar列。
private String valueToSearchFor;

public CalendarSpecification(String randomColumnName,String valueToSearchFor){
this.randomColumnName = randomColumnName;
this.valueToSearchFor = valueToSearchFor;

$ b @Override
public Predicate toPredicate(Root< Calendar> root,CriteriaQuery<?> query,CriteriaBuilder builder){
return builder.and(builder .equal(root。< String> get(this.randomColumnName),this.valueToSearchFor));
}
}


@Service
公共类CalendarService {

@Autowired
私有CalendarRepository calendarRepository;

公共列表<日历> findCustom(String randomColumnName,String valueToSearchFor){
CalendarSpecification cs = new CalendarSpecification(randomColumnName,valueToSearchFor);
返回calendarRepository.find(cs);
//或使用lambda表达式 - 无需CalendarSpecification类。
// return calendarRepository.find((Root< ProductCategory> root,CriteriaQuery<> query,CriteriaBuilder builder) - > {
// return builder.and(builder.equal(root。< ; String> get(randomColumnName),valueToSearchFor));
//});
}
}


I just wanted to know how to pass column name and its value to @Query annotation in Spring Data JPA.

Basically column names will be static and we used to put every column as a element in Entity class. But here I want something different, here column name will be dynamic I will be passing this value as Parameter to the method defined in repository.

Table - Calendar

Columns - id, PersonName, 1, 2, 3......31

Above is the table structure, 1,2,3,.....31 are the column names which represents calendar days and we have values in that columns. I'm using Spring Data JPA to fetch data from DB. Here I just wanted to fetch person name for a particular day. Below given the function defined in repository.

@Query("select c from Calendar c where :calendarDay=:value")
List<Calendar> getPersonName(@Param("calendarDay") String calendarDay, @Param("value") String value);

This is not working for me. Any help would be appreciated.

解决方案

Take a look at sping data Specifications. You can find your solution there!
Reading the docs you can see that if Calendar is your domain (I would try to find a different name for my domain, there is a Calendar class in Java SE already), then you could use something like the above,

@Repository
public interface CalendarRepository extends JpaRepository<Calendar, Integer>, JpaSpecificationExecutor<Calendar> {
}


public class CalendarSpecification implements Specification<Calendar> {

    private String randomColumnName; // A varchar column.
    private String valueToSearchFor;

    public CalendarSpecification(String randomColumnName, String valueToSearchFor) {
        this.randomColumnName = randomColumnName;
        this.valueToSearchFor = valueToSearchFor;
    }

    @Override
    public Predicate toPredicate(Root<Calendar> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
        return builder.and(builder.equal(root.<String>get(this.randomColumnName), this.valueToSearchFor));
    }
}


@Service
public class CalendarService {

    @Autowired
    private CalendarRepository calendarRepository;

    public List<Calendar> findCustom(String randomColumnName, String valueToSearchFor) {
        CalendarSpecification cs = new CalendarSpecification(randomColumnName, valueToSearchFor);
        return calendarRepository.find(cs);
        // Or using lambda expression - without the need of CalendarSpecification class.
//      return calendarRepository.find((Root<ProductCategory> root, CriteriaQuery<?> query, CriteriaBuilder builder) -> {
//          return builder.and(builder.equal(root.<String>get(randomColumnName), valueToSearchFor));
//      });
    }
}

这篇关于Spring Data JPA - 传递列名和值作为参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆