14

私は MyBatis 3.0.3 を使用していますが、問題があります: データベース内のいくつかの列にはアンダースコアが付いた名前があり、これらの列はエンティティ プロパティにマップする必要があります (もちろんキャメルケースです)。

class User {
  private String first_name;
  ...
}

public interface UserDao {
  @Select("SELECT * FROM users")
  List<User> findAllUsers();
}

残念ながら、それを宣言的に解決する方法はわかりません(JPAで行われているように- @Column(name = "first_name"))。そのような列の select-clause でエイリアスを作成することもできます (sush as first_name as firstName など) が、それも不十分に見えます。

何か案は?ありがとう。

4

6 に答える 6

24

DwBに感謝します。それは助けました:

    @Select("SELECT * FROM users")
    @Results({
        @Result(property = "firstName", column = "first_name"),
        @Result(property = "lastName", column = "last_name")
    })
    List<User> findUsers();

psしかし、複数のクエリの場合、エンティティ User が返されるメソッドごとに @Results/@Result コードをボイラープレートする必要があります。私の場合、場所は非常に少ないので問題ありませんが、一般的には、より一般的な解決策を見つけたいと考えています。

于 2011-02-23T07:06:21.173 に答える
5

ResultMapファイルで aを定義し、UserMapper.xml次の行を追加します。

<resultMap id="BaseResultMap" type="package.for.User">
  <result column="user_name" jdbcType="VARCHAR" property="userName" />
  <!--  other columns -->
</resultMap>

@ResultMapJava コードで、注釈を追加します。

public interface UserDao {
  @Select("SELECT * FROM users")
  @ResultMap("BaseResultMap")
  List<User> findAllUsers();
}

MyBatis Generatorを使用して、これらのベース コードを自動的に生成できます。

于 2013-07-17T06:41:57.703 に答える
4

春の注釈ベースの構成では、アンダースコアからキャメルケースへのマッピングは、次のようにカスタマイズ可能な SqlSessionFactory を介して有効にできます。

@Bean
@Primary
public SqlSessionFactory sqlSessionFactory() throws Exception {
    SqlSessionFactory factory = sessionFactoryBuilder().build();
    factory.getConfiguration().setMapUnderscoreToCamelCase(true);
    // other configurations
    return factory;
}
于 2016-06-03T05:57:20.530 に答える
4

列がそれほど多くない場合は、このようにして ResultMap を回避できます。

@Select("SELECT first_name as firstName, last_name as lastName FROM users")
List<User> findUsers();

読みやすくするために、文字列の配列を使用できます。これは、MyBatis が余分なスペースと連結します。

@Select({
     "SELECT",
     "  first_name as firstName,",
     "  last_name as lastName",
     "FROM users"})
List<User> findUsers();
于 2014-07-18T13:45:01.393 に答える