用于存储结果集中的行的类的名称是什么?

时间:2017-02-08 12:23:59

标签: java design-patterns orm naming-conventions

出于性能原因,许多报告查询在ORM托管对象之外执行。

为了存储结果,我使用一个每查询类来保存数据库访问方法和服务之间的数据行。

例如在Java / Hibernate / Spring中:

@Repository
public interface DataRepository extends JpaRepository<DataDAO, Long> {

    @Query("select new com.evil.db.XXX(...) from #{#entityName} where ...")
    List<XXX> findXXX(...);      

XXX的名称是什么?是DTO还是DAO还是Business object?如何在模式书籍和框架参考手册中命名中间存储类?它是一个POJO,但这个词太通用了......

我通常将这些类作为内部静态类保存,并且没有任何问题可以给出适合于包含数据的名称。

但我喜欢为类名添加后缀,如果它是顶级类来表示它的角色,就像传统上它是为DAO / Service / Controller /等...

1 个答案:

答案 0 :(得分:0)

假设您正在使用存储库模式,您不应该遇到此命名问题。存储库模式通常由名为 IRepository 的接口定向 - 或者也可以是抽象类 - 表示数据库上的泛型操作,如下所示(C#代码):

public interface IRepository<T>
{
    T GetById(int id);
    IEnumerable<T> List(Expression<Func<T, bool>> predicate);
    void Add(T entity);
    void Delete(T entity);
    void Update(T entity);
}

在您的情况下,由于您需要一些自定义查询,您应该为特定情况创建一个界面。以下示例引用了产品域( IProductRepository )的特定存储库,该存储库强制实现 IRepository

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public interface IProductRepository : IRepository<Product>
{
    Product GetProductBySomething(string somemething);
    IEnumerable<Product> GetAvailableProducts();
}

最后,您将创建一个实现 IRepositoryProduct 的具体类。

public class ProductRepository : IProductRepository
{
    public void Add(Product entity)
    {
        // ...
    }

    public void Delete(Product entity)
    {
        // ...
    }

    public IEnumerable<Product> Get(Expression<Func<Product, bool>> predicate)
    {
        // ...
    }

    public Product Get(int id)
    {
        // ...
    }

    public IEnumerable<Product> GetAvailableProducts()
    {
        // ...
    }

    public Product GetProductBySomething(string somemething)
    {
        // ...
    }

    public void Update(Product entity)
    {
        // ...
    }
}

    public Product Get(int id)
    {
        // ...
    }

    public void Update(Product entity)
    {
        // ...
    }
}

使用这种方法,您的方法不应该有命名问题,因为它们将遵循接口约定。