我有一个数据类型为char(20)的db表。我不允许将其更改为varchar。
我正在写一个映射到该表的JPA实体。我希望在我的实体类中表示此列的字符串字段始终包含调整后的值,而不是用数据库中存在的空格填充的20个字符的值。
我看不到任何简单的方法来做到这一点。(注释会震撼!)。此刻,我只是从我的getter()返回一个修整后的值,但这感觉像是一团糟。
谷歌搜索对此没有帮助。有任何想法吗?
或者,您可以使用生命周期注释:
@Entity
public class MyEntity {
@PostLoad
protected void repair(){
if(myStringProperty!=null)myStringProperty=myStringProperty.trim();
}
private String myStringProperty;
public String getMyStringProperty() {
return myStringProperty;
}
public void setMyStringProperty(String myStringProperty) {
this.myStringProperty = myStringProperty;
}
}
如果在多个实体上发生这种情况,则可以创建一个自定义批注并编写一个专用的EntityListener。
注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Trim {}
听众
public class TrimListener {
private final Map<Class<?>, Set<Field>> trimProperties =
new HashMap<Class<?>, Set<Field>>();
@PostLoad
public void repairAfterLoad(final Object entity) throws Exception {
for (final Field fieldToTrim : getTrimProperties(entity.getClass())) {
final String propertyValue = (String) fieldToTrim.get(entity);
if (propertyValue != null)
fieldToTrim.set(entity, propertyValue.trim());
}
}
private Set<Field> getTrimProperties(Class<?> entityClass) throws Exception {
if (Object.class.equals(entityClass))
return Collections.emptySet();
Set<Field> propertiesToTrim = trimProperties.get(entityClass);
if (propertiesToTrim == null) {
propertiesToTrim = new HashSet<Field>();
for (final Field field : entityClass.getDeclaredFields()) {
if (field.getType().equals(String.class)
&& field.getAnnotation(Trim.class) != null) {
field.setAccessible(true);
propertiesToTrim.add(field);
}
}
trimProperties.put(entityClass, propertiesToTrim);
}
return propertiesToTrim;
}
}
现在使用注释所有相关的String字段,@Trim
并在persistence.xml中将侦听器注册为默认实体侦听器:
<persistence-unit ..>
<!-- ... -->
<default-entity-listeners>
com.somepackage.TrimListener
and.maybe.SomeOtherListener
</default-entity-listeners>
</persistence-unit>
问题内容: 与该方法等效的 JavaScript 是什么: C#仅在字符串的 开头 和 结尾 处修剪所选字符! 问题答案: 一行就足够了: 在功能上:
问题内容: 如何修剪JavaScript中的字符串? 问题答案: 自IE9 +起,所有浏览器都具有字符串方法。 对于不支持的浏览器,可以使用MDN中的以下polyfill : 也就是说,如果使用,也可以使用,并且可以处理undefined / null。 看到这个:
问题内容: 如果长度超过10个字符,我想修剪字符串。 假设字符串长度为12(),则新的修剪后的字符串将包含。 我该如何实现? 问题答案: s = s.substring(0, Math.min(s.length(), 10)); 这样使用字符串可以避免在字符串已经短于的情况下出现异常。 笔记: 上面做了真正的修剪。如果您实际上想将截断的最后三个(!)字符替换为点,请使用Apache Commons
问题内容: 如何修剪Java中的字符? 例如 j 应该是 “乔\吉尔” j 应该是 “ \ joe \ jill \” 等等 问题答案: Apache Commons 有一个很棒的StringUtils类(org.apache.commons.lang.StringUtils)。其中有一种方法可以满足您的需求。 我强烈建议无论如何都要使用Apache Commons,尤其是Collections和
问题内容: Java字符串修剪不会为我删除空格字符。 输出为。请注意1右边的空间。 我必须从字符串中删除尾随空格,但既不要也不删除它。 无论哪种方式,字符串都保持相同。 编辑:完整代码 :: 为什么我不能删除那个空间? 问题答案: 该网站的源代码显示特殊的html字符。尝试在您的java字符串中搜索或替换以下内容:。 那是一个不可破坏的空间。请参阅:我有一个带有“ \ u00a0”的字符串,我需要
问题内容: 下面程序的输出: 是: 然而 如何从字符串的开头和结尾删除换行符(Java)? 否则说。 我想念什么? 问题答案: 既然是一成不变的 不会更改基础值,它会返回一个没有开头和结尾空格字符的新值。您需要替换参考