java - 保留一组星期几

标签 java hibernate bit-manipulation

我正在寻找一种有效的方法来保留一组星期几。换句话说,用户将从工作日列表中选择任意天数。具体日期无关紧要,重要的是星期几。我需要将这组日期存储在 hibernate 实体中。

我可以存储其中之一:

Set<DayOfWeek>
Set<Integer>

但我认为它可能比这更简单。如果我只使用一个 int 来存储数据并使用按位运算怎么办?例如:

Sun = 1
Mon = 2
Tue = 4
Wed = 8
Thu = 16
Fri = 32
Sat = 64

因此,为了表示 Sun、Mon、Wed、Sat 的集合,我会保留整数 75。这是因为 1+2+8+64 = 75。

我关心的是在这样的字段上执行查询。我能否找到 Wed 选择的所有实体?

这看起来是个好方法吗?有人有更好的主意吗?

谢谢!

最佳答案

您可以使用 Enum 来设置星期几

public enum DAYS_OF_THE_WEEK {
    SUN,
    MON,
    TUE,
    WED,
    THU,
    FRI,
    SAT;
}

现在您可以使用值类型的集合,因为 Hibernate 支持它。

@CollectionOfElements
@Enumerated(EnumType.STRING)
@JoinTable(
    name="SELECTED_DAYS_OF_THE_WEEK",
    joinColumns=@JoinColumn(name="<OWNING_ENTITY_ID_GOES_HERE>")
)
public Set<DAYS_OF_THE_WEEK> getSelectedDays() {
    return this.selectedDays;
}

不要忘记复合元素或值类型实例的生命周期受所属实体实例生命周期的限制。

如前所述:

Would I be able to find all entities that have Wed selected ?

select distinc OwningEntity _owningEntity inner join fetch _owningEntity.selectedDays selectedDay where selectedDay = :selectedDay

query.setParameter("selectedDay", DAYS_OF_THE_WEEK.WED);

query.list();

添加到原始答案:我如何实现 FetchingStrategy

假设有以下模型

@Entity
public class Customer {

    private List<Order> orderList = new ArrayList<Order>();

    // getter's and setter's

}

现在我们的接口(interface) CustomerRepository

public interface CustomerRepository {

    Customer getById(Integer id, CustomerFetchingStrategy fetchingStrategy);
    List<Customer> getAll(CustomerFetchingStrategy fetchingStrategy);

    public static enum CustomerFetchingStrategy {
        PROXY,
        CUSTOMER,
        CUSTOMER_WITH_ORDERS;         
    }

}

我们的实现

import static br.com.app.CustomerRepository.CustomerFetchingStrategy;

public class CustomerRepositoryImpl implements CustomerRepository {

    // Usually Spring IoC or Seam @In-jection or something else
    private SessionFactory sessionFactory;

    public Customer getById(Integer id, CustomerFetchingStrategy fetchingStrategy) {
        switch(fetchingStrategy) {
            case PROXY:
                return (Customer) sessionFactory.getCurrentSession().load(Customer.class, id);
            case CUSTOMER:
                return (Customer) sessionFactory.getCurrentSession().get(Customer.class, id);
            case CUSTOMER_WITH_ORDERS:
                return (Customer) sessionFactory.getCurrentSession().createQuery("from Customer c left join fetch c.orderList where c.id = :id")
                                  .setParameter("id", id)
                                  .list().get(0);
        }
    }

    public List<Customer> getAll(CustomerFetchingStrategy fetchingStrategy) {
        // Same strategy as shown above
    }

} 

因此,是否某些用例需要客户,我称

import static br.com.app.CustomerRepository.CustomerFetchingStrategy;

public class SomeController {

    // Again Spring Ioc or Seam @In-jection
    private CustomerRepository customerRepository;

    public void proccessForm(HttpServletRequest request, HttpServletResponse response) {
        request.setParameter("customer", customerRepository.getById(Integer.valueOf(request.getParameter("customerId"))), CUSTOMER);
    }
}

希望对你有用

问候,

关于java - 保留一组星期几,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2233943/

相关文章:

java - 如何让 Selenium 等到特定位置的文本

java - 是否有 Java 类文件格式的声明性正式规范?

java - 我在 JpaQuery spring-boot 中遇到空异常

c - 找出在C中没有循环的情况下x除以2的频率

java - ListView 对话框中的空指针异常

Java - 在没有 POJO 的情况下递归地从 JSON 字符串中删除字段

java - Hibernate 仅将新记录插入数据库

java - 使用 Spring 错误的 Hibernate 一对多映射

bit-manipulation - 位操作/操作计算器?

c# - 获取前导 1 的位数